- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
djb2 algorithm有一个字符串的哈希函数。
unsigned long hash = 5381;
int c;
while (c = *str++)
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
为什么 5381 和 33 如此重要?
最佳答案
这个哈希函数类似于 Linear Congruential Generator (LCG - 生成一系列伪随机数的简单函数类),通常具有以下形式:
X = (a * X) + c; // "mod M", where M = 2^32 or 2^64 typically
请注意与 djb2 哈希函数的相似性...a=33,M=2^32。为了使 LCG 具有“完整周期”(即尽可能随机),a 必须具有某些属性:
此外,c 和 M 应该互质(对于 c 的奇数值来说也是如此)。
正如您所看到的,这个哈希函数有点类似于一个好的 LCG。当谈到哈希函数时,您需要一个能够在给定一组实际输入字符串的情况下生成哈希值的“随机”分布的函数。
至于为什么这个哈希函数对字符串有好处,我认为它在速度极快和提供合理的哈希值分布之间取得了很好的平衡。但我见过许多其他哈希函数,它们声称具有更好的输出特性,但涉及更多行代码。例如参见this page about hash functions
编辑:This good answer解释了出于实际原因选择 33 和 5381 的原因。
关于hash - 为什么 5381 和 33 在 djb2 算法中如此重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1579721/
谁能告诉我为什么 DJB 哈希函数中使用数字 5381? DJB 哈希函数定义为: h 0 = 5381 h i = 33h i - 1 + s i 这是一个 C 实现: unsigned int D
如果我使用 64 位无符号整数,Dan Bernstein 的哈希函数是否仍能正常运行? uint64 hash_djb2(register uchar *str, register size_t l
我是一名优秀的程序员,十分优秀!