什么时候使用简单的模数作为哈希函数是合适的?



我需要从32位数字创建一个16位哈希,我试图确定一个简单的模数2^16是否合适。

该哈希值将用于2^16条目哈希表中,用于快速查找32位数字。

我的理解是,如果数据空间具有相当均匀的分布,那么简单的mod 2^16就可以了-它应该不会导致太多的碰撞。

在这种情况下,我的32位数字是修改adler32校验和的结果,使用2^16作为m。

所以,在一般意义上,我的理解是正确的,这是很好的使用一个简单的mod n(其中n是哈希表的大小)作为哈希函数,如果我有一个均匀的数据分布?

具体来说,adler32会给出一个足够随机的分布吗?

是的,如果你的32位数字均匀分布在所有可能的值上,那么其中的模n也将均匀分布在n个可能的值上。

修改后的校验和算法的结果是否均匀分布是一个完全不同的问题。这将取决于您应用算法的数据是否有足够的数据来滚动求和几次。如果您将算法应用于不滚动求和的短字符串,则结果将不是均匀分布。

如果你想要一个哈希函数,那么你应该使用哈希函数。Adler-32和CRC都不是一个好的哈希函数。在公共领域有许多非常快速和有效的哈希函数可用。你可以看看CityHash

相关内容

  • 没有找到相关文章

最新更新