Hash 为什么人们使用散列(k)=c*k和素数c
给定一个整数m,在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=
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的幂。对模使用素数通常很重要,但对乘法不重要。