给定整数m,T
上定义的散列函数是映射T -> {0, 1, 2, ..., m - 1}
。如果k
是T
的元素且m
是正整数,则我们将hash(k, m)
表示其散列值。
为简单起见,大多数哈希函数的格式为hash(k, m) = f(k) % m
,其中f
是从T
到整数集的映射。
如果m = 2^p
(通常用于模m
操作很便宜)并且T
是一组整数,我看到很多人使用{{1} f(k) = c * k
是素数。
我了解如果您要选择c
形式的函数,则每个哈希表大小f(k) = c * k
需要gcd(c, m) = 1
。即使使用素数符合账单,m
也很好。
所以我的问题如下:为什么人们仍然使用c = 1
作为哈希函数?它有什么好的属性?
答案 0 :(得分:0)
你不需要它是素数。具有可证明的抗冲突性的最有效散列函数之一只是乘以随机数:https://en.wikipedia.org/wiki/Universal_hashing#Avoiding_modular_arithmetic。但你需要它是奇怪的。