Hash 为什么人们使用散列(k)=c*k和素数c

Hash 为什么人们使用散列(k)=c*k和素数c,hash,Hash,给定一个整数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是一组整数的情况下,我看到许多人使用f(k)=c*k,其中c是一个素数 我知道如果你想选择一个函数的形式是f(k)=c*k,你需要为每个哈希表大小m设置gcd(c,m)=1。即使使用素数符合要求,c=

给定一个整数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
是一组整数的情况下,我看到许多人使用
f(k)=c*k
,其中
c
是一个素数

我知道如果你想选择一个函数的形式是
f(k)=c*k
,你需要为每个哈希表大小
m
设置
gcd(c,m)=1
。即使使用素数符合要求,
c=1也很好


所以我的问题是:为什么人们仍然使用
f(k)=prime*k
作为散列函数?它有什么好的属性?

你不需要它是素数。具有可证明的抗冲突性的最有效哈希函数之一仅与随机数相乘:。然而,你确实需要它是奇数。

你不需要它是素数。具有可证明的抗冲突性的最有效哈希函数之一仅与随机数相乘:。不过,你确实需要一些奇怪的链接。

这些链接都不能回答我的问题。例如,在Joe给出的链接中,他们解释了为什么对
m
使用素数是个好主意。顺便说一下,我同意他们的观点。但我的问题不同,因为gcd=1,
(c*k)%(1@wildplasser:但是k%(1)这些链接都没有回答我的问题。例如,在Joe给出的链接中,他们解释了为什么对
m
使用素数是个好主意。顺便说一下,我同意他们的观点。但是我的问题不同。因为gcd=1,
(c*k)%(1@wildplasser:但是k%(1这里
odd
的意思是:相对素数表示表的大小。@我想是wildplasser,但这仅仅是因为哈希函数为某些
k>0
输出
2^k
位。如果我们可以将该数字模化为某个素数,如果我们需要将其变小,但通常哈希表的大小都是2的幂。使用素数表示模通常很重要,只是不适用于乘法。这里的奇数意味着:相对素数wrt表大小。@我想是wildplasser,但这只是因为哈希函数为一些
k>0
输出
2^k
位。如果我们可以将该数字模化为一些素数,如果我们需要将其变小,但通常是哈希表E的大小是2的幂。对模使用素数通常很重要,但对乘法不重要。