何时使用简单模数作为散列函数是否合适?

时间:2014-05-02 18:31:13

标签: hash modulus adler32

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

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

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

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

因此,从一般意义上讲,我的理解是正确的,如果我有一个偶数数据分布,那么使用一个简单的mod n(其中n是散列表大小)作为散列函数是没问题的吗?

具体来说,adler32会为此提供足够随机的分布吗?

1 个答案:

答案 0 :(得分:1)

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

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

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