【发布时间】:2022-01-17 02:58:09
【问题描述】:
uint32_t jenkins_one_at_a_time_hash(const uint8_t* key, size_t length) {
size_t i = 0;
uint32_t hash = 0;
while (i != length) {
hash += key[i++];
hash += hash << 10;
hash ^= hash >> 6;
}
hash += hash << 3;
hash ^= hash >> 11;
hash += hash << 15;
return hash;
}
来源:https://en.wikipedia.org/wiki/Jenkins_hash_function
将hash<<10 添加到hash 时,如果字符串长度很大,则可能会溢出。当使用多项式散列函数对字符串进行散列时,我们在每次迭代中取mod p 值(p 是uint32_t 范围内的一个大素数),并返回hash % hash_table_length。但是在这个算法中,我们为什么不采取hash = (hash + (hash<<10)) % p来防止溢出呢?我们如何确保返回的hash 值保持在哈希表长度范围内?
【问题讨论】:
标签: string algorithm hash overflow mod