您可以使用顯示here的方法比較各種Hash
函數的質量,該方法在字典單詞的哈希表中記錄衝突。結果Counts
存儲在Ada.Containers.Ordered_Maps
的實例中。
作爲具體的例子,庫Hash
功能
function Hash is new Ada.Strings.Bounded.Hash(ASB);
產生具有爲的話一半以上獨特散列和在最壞情況下僅七碰撞的結果:
Word count: 235886
Table size: 393241
Load factor: 59.99%
0: 215725 (0.00%)
1: 129710 (54.99%)
2: 38727 (32.84%)
3: 7768 (9.88%)
4: 1153 (1.96%)
5: 143 (0.30%)
6: 14 (0.04%)
7: 1 (0.00%)
相反,這Hash
功能
function Hash(Key : ASB.Bounded_String) return Ada.Containers.Hash_Type is
S : String := ASB.To_String(Key);
H : Ada.Containers.Hash_Type := 0;
begin
for C of S loop
H := H * 3 + Character'Pos(C);
end loop;
return H;
end;
產生具有獨特的散列爲不到一半的話,並且每個20次碰撞在最壞的情況下,兩個不同的散列值。結果:
Word count: 235886
Table size: 393241
Load factor: 59.99%
0: 236804 (0.00%)
1: 107721 (45.67%)
2: 32247 (27.34%)
3: 9763 (12.42%)
4: 3427 (5.81%)
5: 1431 (3.03%)
6: 813 (2.07%)
7: 441 (1.31%)
8: 250 (0.85%)
9: 150 (0.57%)
10: 88 (0.37%)
11: 41 (0.19%)
12: 27 (0.14%)
13: 14 (0.08%)
14: 11 (0.07%)
15: 7 (0.04%)
16: 2 (0.01%)
17: 1 (0.01%)
19: 1 (0.01%)
20: 2 (0.02%)
一般一個使得散列表的大小的質數,以確保更均勻的分佈。 – user3344003
我假設的作業,因爲你被困在次優散列函數。 –