【发布时间】:2018-05-12 19:33:38
【问题描述】:
我现在正在学习 C,我最初为我在 CS50 edx 课程中构建的拼写检查程序构建了这个哈希函数。
int hashing(char *word)
{
unsigned int hash = 0;
for (int i = 0, n = strlen(word); i < n; i++)
hash += word[i];
return hash % HTABLE_SIZE;
}
然后我在 reddit 上偶然发现了这个hash function,它使用了位移运算符。
int hashing(char *word)
{
unsigned int hash = 0;
for (int i = 0, n = strlen(word); i < n; i++)
hash = (hash << 2) ^ word[i];
return hash % HTABLE_SIZE;
}
使用这个哈希函数,我的程序速度从 0.13 秒变为 0.06 秒。有人可以向我解释一下为什么这个散列函数要快得多吗?
【问题讨论】:
-
您使用的是哪个编译器?另外,使用在线Compiler Explorer 查看从您的源代码生成的汇编代码。
-
考虑到这是一个散列函数,很可能是因为生成的散列分布。这些都不是很好的哈希,但第一个的弱点似乎更可能出现在拼写检查器中 - 例如,重新排序字母不会影响第一个中的哈希。
-
当然,试图从这些微小的代码 sn-ps 推断整个未知程序在未知编译器和架构上以未知设置编译并在未知输入上运行的行为是徒劳的。这个问题无法回答。
-
他们没有。如果您关心效率,那么您的两个功能都是可怕的。用简单的
a[i]替换strlen函数以了解它是否是零字节。因此,您从一开始就假设一个比另一个更有效的假设是不成立的。正如@DavidC.Rankin 所说,首先了解哈希函数以及不同的优点和缺点。然后,如果(且仅当)存在可衡量的和相关的性能问题,请尝试提高性能。 -
我和@user2357112 在一起。最有可能的是,哈希函数并没有明显更快(如果它更快的话)但是生成的哈希值不同,所以哈希表可能会更好地使用(但是,您没有包含任何您如何处理计算的哈希的信息)
标签: c hashtable bit-shift cs50 hash-function