我想使用一个使用3个步骤的简单散列函数来散列以下键“LOWELL”:
第1步:将密钥转换为数字。
LOWELL = | L | O | W | E | L | L | | | | | | |
ASCII code: 76 79 87 69 76 76 32 32 32 32 32 32
我的问题在这里为什么它用固定的ASCII码32添加了6个空位
步骤2:折叠并添加(切掉数字并添加 他们在一起)
7679|8769|7676|3232|3232|3232|
7679+8769+7676+3232+3232+3232 = 33,820
步骤3:将素数乘以素数
33,820 mod 19937 = 13,883
这里有另一个问题,为什么除以素数我发现了这一点 回答:当有序列时,除以数字是好的 连续数字。如果有许多不同的序列 连续数字,除以具有许多小因子的数字 可能会导致很多碰撞。素数是更好的选择。但我没有得到它
步骤4:除以地址空间的大小(最好是素数)。 13,883 mod 101 = 46
最后为什么划分了地址空间?!
您可以找到详细步骤here(幻灯片350) 非常感谢您的帮助
答案 0 :(得分:1)
由于您的地址空间仅包含101
个广告位,因此您无法将记录置于地址超出此限制的位置。
因此,您将通过地址空间提取散列函数(在您的情况下为13,883
)的输出的提示,以确保记录的位置落在允许的地址空间中。
因此h(s) % address_space
将始终在您的地址空间中提供允许的位置。
关于你的第一个问题,为什么我们在散列中使用素数,这个主题将帮助你: Why use a prime number in hashCode?