【发布时间】:2015-11-14 15:45:33
【问题描述】:
我正在使用哈希表来存储一些值。以下是详细信息:
- 将存储大约 100 万个项目(以前未知,因此不可能进行完美哈希)。
- 表有 10M 大。
- 哈希函数是 MurMurHash3。
我做了一些测试并存储了 1M 的值,我得到了 350,000 个冲突和 30 个元素在最冲突的哈希表的插槽中。
这些结果好吗?
对在冲突哈希表的槽中创建的列表实施二进制搜索是否有意义?
您对提高性能有何建议?
编辑:这是我的代码
var
HashList: array [0..10000000 - 1] of Integer;
for I := 0 to High(HashList) do
HashList[I] := 0;
for I := 1 to 1000000 do
begin
Y := MurmurHash3(UIntToStr(I));
Y := Y mod Length(HashList);
Inc(HashList[Y]);
if HashList[Y] > 1 then
Inc(TotalCollisionsCount);
if HashList[Y] > MostCollidingSlotItemCount then
MostCollidingSlotItemCount := HashList[Y];
end;
Writeln('Total: ' + IntToStr(TotalCollisionsCount) + ' Max: ' + IntToStr(MostCollidingSlotItemCount));
这是我得到的结果:
Total: 48169 Max: 5
我错过了什么吗?
【问题讨论】:
-
1) 您在 1000 万个盒子上分发 100 万件物品? 2) 你对碰撞的定义是什么?
-
1) 是 2) 映射到表中同一个槽的两个不同键
-
随机填充时每个单元格的预期元素数:0:9048K 1:905K 2:45K 3:1K5 4:50 结论:您的哈希函数很糟糕(或您的数据包含重复项)
-
我尝试将十进制数字(作为字符串)从 1 散列到 1000000。我也得到了与 SHA1 相同的结果。
-
检查你的字符串。对于数字键,乘以一个大的奇数(最好是素数)与 real 散列函数一样好。