- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在用 C 语言实现散列表和散列函数,听说 Murmurhash 是适合此目的的快速算法。为此提供的查找一些 C 代码:
uint32_t murmur3_32(const char *key, uint32_t len, uint32_t seed) {
static const uint32_t c1 = 0xcc9e2d51;
static const uint32_t c2 = 0x1b873593;
static const uint32_t r1 = 15;
static const uint32_t r2 = 13;
static const uint32_t m = 5;
static const uint32_t n = 0xe6546b64;
uint32_t hash = seed;
const int nblocks = len / 4;
const uint32_t *blocks = (const uint32_t *) key;
int i;
for (i = 0; i < nblocks; i++) {
uint32_t k = blocks[i];
k *= c1;
k = (k << r1) | (k >> (32 - r1));
k *= c2;
hash ^= k;
hash = ((hash << r2) | (hash >> (32 - r2))) * m + n;
}
const uint8_t *tail = (const uint8_t *) (key + nblocks * 4);
uint32_t k1 = 0;
switch (len & 3) {
case 3:
k1 ^= tail[2] << 16;
case 2:
k1 ^= tail[1] << 8;
case 1:
k1 ^= tail[0];
k1 *= c1;
k1 = (k1 << r1) | (k1 >> (32 - r1));
k1 *= c2;
hash ^= k1;
}
hash ^= len;
hash ^= (hash >> 16);
hash *= 0x85ebca6b;
hash ^= (hash >> 13);
hash *= 0xc2b2ae35;
hash ^= (hash >> 16);
return hash;
}
我想知道我是否可以就此处传递的论点澄清一些事情。 “ key ”显然是您正在散列的字符串。如果在结构中将其定义为数组长度为 46,那么这是否是我在上述函数中作为“长度”传递的值?参数“种子”,我认为它可以是任意值,只要它在哈希调用之间保持不变即可?考虑到我在 32 位机器上工作,是否还有其他需要更改的参数?
我认为我还需要根据哈希表的大小对返回哈希求模吗?
此外,如果有人可以推荐用于字符串的更好/更快的替代哈希函数,那么将不胜感激
提前致谢
最佳答案
关于参数的问题:是的,看看代码,你的假设是正确的。
只要你的哈希表的大小是 2 的幂,你就不需要取模。然后你可以只使用一个位掩码,例如(伪代码)
void* hashtbl[1<<8]; /* 256 */
int key = hash(value, ...) & ((1<<8) - 1); /* 0xff */
请记住,性能并不是哈希函数的唯一相关特征。获得整个 key 空间的平均分配非常重要。我无法告诉您 murmurhash 在这方面有多“好”,但可能比我最近使用的非常简单的散列要好得多:
static unsigned int
hash(const void *key, size_t keyLen, unsigned int hashmask)
{
size_t i;
unsigned int h = 5381;
for (i=0; i<keyLen; ++i)
{
h += (h << 5) + ((const unsigned char *)key)[i];
}
return h & hashmask;
}
尽管这个简单的函数可能更快。这是一个权衡,一个“聪明”的散列算法试图尽可能快,同时仍然提供良好的分布。上面的简单函数并没有真正提供良好的分布,例如它永远不会将整个 key 空间用于小输入(小于 5 个字节)。
关于c - 在 C 语言中使用 Murmurhash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32795453/
我正在使用 C/C++ 中的 murmurhash 函数,就像这里建议的那样:https://sites.google.com/site/murmurhash/ (MurmurHash2.cpp)。我
我用 Murmur hash 对 800 000 个字符串值进行哈希处理,这导致了很多冲突(冲突),大约有 17 个冲突(不同的字符串给出相同的哈希值),这是否正常,任何人都知道 murmur has
我一直在努力深入了解 MurmurHash 是什么做。 我已经阅读了基本说明,但还没有找到关于何时使用它以及为什么使用它的良好解释。我知道它非常快,但想了解更多。 我问了一个相关的question关于
我正在查看 MurmurHash (sites.google.com/site/murmurhash/)我正在以一种黑盒子的方式使用它,而不是在这个阶段试图理解数学。 但是,我确实稍微看了一下代码并且
在 Scala 2.10 中,MurmurHash 由于某种原因已被弃用,说我现在应该使用 MurmurHash3。但 API 不同,MurmurHash3 没有有用的 scaladocs -> 失败
我正在用 C 语言实现散列表和散列函数,听说 Murmurhash 是适合此目的的快速算法。为此提供的查找一些 C 代码: uint32_t murmur3_32(const char *key, u
我需要(但找不到)MurmurHash 的纯 python(无 c++)实现,我太新手了,不能自己写。速度或内存使用对我的项目来说并不重要。 我找到了一个尝试 here ,但它仅限于 31 位散列,我
我需要使用 murmurhash 对 NSString 进行哈希处理我被迫这样做,因为其他团队正在这样做,我需要在 x86 平台上使用 64 位 key 长度,有人在 objective-C 中实现或
我正在使用 SBT 0.13.2(也可以是 0.13.5),并且正在尝试为 2.10 编写一个项目并将其交叉编译为 2.9 和 2.10。它使用 scala.util.hashing.MurmurHa
编辑:请参阅评论以获取正确答案。 大家好,我在安装 NLP 程序 SpaCY 时遇到了一个问题。 我尝试了 pip install -U spacy 和 pip install spacy,但我似乎遇
我正在尝试使用 MurmurHash(在 64 位计算机上返回 64 位哈希值)并已将简单的 3 个字母字符串“yes”发送给它,如下所示 char* charptr = "yes"; cout *
Haskell 和 Python 似乎不同意 Murmurhash2 结果。 Python、Java 和 PHP 返回相同的结果,但 Haskell 没有。关于 Haskell 上的 Murmurha
我正在编写一个 BloomFilter 并想使用 Scala 的默认 MurmurHash3 实现:scala.util.MurmurHash3。我的编译失败,但是出现以下编译错误: [error]
查看使用接受字符串并返回 64 位带符号整数值的哈希算法。 它不必在密码学上是可靠的,只要提供一个合适的冲突率就可以用作分布式存储的 key 。 我在看 murmur hash that seems
我是一名优秀的程序员,十分优秀!