为什么复合数字不适合划分哈希?

use*_*310 1 algorithm hash data-structures

这是我关于stackflow的第一个问题.如您所知,我是学习算法和数据结构的新手.

当使用除法方法来创建散列函数(即h(k)= k mod m)时,建议(例如通过CLRS)使用对于除数m而言不太接近2的幂的素数.有人可以向我解释为什么选择m作为复合数是坏的吗?

Igo*_*sky 13

考虑如果m是偶数并且所有k值都是偶数的情况.然后,哈希值也将是均匀的.

例如,考虑m = 6哈希偶数值的情况:

Input values:  0, 2, 4, 6, 8, 10, 12, 14, 16, ...
Hash values:   0, 2, 4, 0, 2,  4,  0,  2,  4, ...
Run Code Online (Sandbox Code Playgroud)

如果将这些哈希值用作表的索引,则表的一半将不使用.另一方面,如果m是素数,即使输入值都具有公共因子,您也将获得均匀分布的哈希值.

考虑相同的输入值,但m = 7:

Input values:  0, 2, 4, 6, 8, 10, 12, 14, 16, ...
Hash values:   0, 2, 4, 6, 1,  3,  5,  0,  2, ...
Run Code Online (Sandbox Code Playgroud)

尽管输入值都是偶数,但哈希值仍然均匀分布在[0..6]上.

总而言之,如果m是素数,那么即使所有输入值都可以被共同的素数因子(m除外),你仍然可以获得均匀的哈希值分布.