Hash 如何为整数或字符串哈希选择模?

Hash 如何为整数或字符串哈希选择模?,hash,modulo,Hash,Modulo,通常,我们通过根据规则计算整数或字符串来进行哈希运算,然后返回哈希(int或str)%m作为哈希表中的索引,但是如何选择模m?有什么约定要遵循吗?有两种可能的约定。一种是使用一个质数,它产生 另一种是使用2的幂,因为n mod m,其中m=2^k是一个快速操作;它是一个按位和m-1的。当然,模数必须等于哈希表的大小,二的幂意味着每当哈希表过度拥挤时,它的大小必须加倍。这将以与a类似的方式进行摊销O(1)插入。因为[val modulo m]被用作表中的索引,m是该表中的元素数。你可以自由选择吗?

通常,我们通过根据规则计算
整数
字符串
来进行哈希运算,然后返回
哈希(int或str)%m作为哈希表中的索引,但是如何选择模
m
?有什么约定要遵循吗?

有两种可能的约定。一种是使用一个质数,它产生


另一种是使用2的幂,因为n mod m,其中m=2^k是一个快速操作;它是一个按位和m-1的。当然,模数必须等于哈希表的大小,二的幂意味着每当哈希表过度拥挤时,它的大小必须加倍。这将以与a类似的方式进行摊销O(1)插入。

因为[val modulo m]被用作表中的索引,m是该表中的元素数。你可以自由选择吗?然后使用一个足够大的素数。如果需要调整表的大小,可以选择使用较大的素数,或者(如果选择将表加倍以调整大小),最好确保哈希函数的低位有足够的熵。

@Alcott:第一个素数>n是一个很好的起点。