【发布时间】:2021-10-18 22:37:53
【问题描述】:
在 Dan Bernstein 著名的 Djb2 哈希函数中,我看到使用按位运算符是首选,但为什么要使用它而不是简单的乘法呢?是不是更快?
(散列
// Hashes word to a number
unsigned int hash(const char *word)
{
// Djb2 hash function by Dan Bernstein
unsigned long hash = 5381;
int c;
while ((c = *word++))
{
hash = ((hash << 5) + hash) + tolower(c); /* hash * 33 + c */
}
return hash % N;
}
【问题讨论】:
-
欢迎来到 Stack Overflow。 softwareengineering.stackexchange.com/questions/234967/… 会回答你的问题吗?
-
您可能想检查您的 优化 asm 输出,因为如果在这种情况下该计算的 both 版本我不会感到惊讶最终生成相同的功能代码。 clang 12.01 和 gcc 11.2 都将生成 shift-arithmetic-left 5 和后续添加,无论您是否明确按照所示代码指定 或 仅使用 (hash * 33)。
-
任何现代编译器都会为两者生成相同的代码(godbolt 确认),但在 1991 年设计此算法时可能并非如此。
标签: c hash bit-manipulation