- slots:4096 collisions:1887
- slots:4093 collisions:1844
Med min StringId-klass, när jag kör med ordlista, så lagras 3921 unika strängar i tabellen.
Om man gör antalet slots litet, strax över 4000, så borde man få många kollisioner - jag testade med både tabellstorlek på 4096 (inget primtal) och 4093 (primtal):
och så provade jag att göra en dubbelt så stor tabell, vilket borde ge färre kollisioner - här använde jag storlekarna 8192 (inget primtal) och 8191 (primtal)
- slots:8192 collisions:896
- slots:8191 collisions:900
Jag testade även att byta ut min hash-funktion mot den som hildenborg postade tidigare i den här tråden:
- slots:8192 collisions:911
- slots:8191 collisions:925
Men den gav i princip likadan distribution och antal kollisioner
Slutligen så provade jag versionen med slumpmässiga ord, och där lagras 100000 unika strängar i tabellen. Även här testade jag med stora tabellstorlekar, 262144 (inte primtal) och 262147 (primtal)
- slots:262144 collisions:19176
- slots:262147 collisions:19154
Och med den andra hash-funktionen:
- slots:262144 collisions:19066
- slots:262147 collisions:18999
Så min slutsats måste bli, att med min hashtabellsimplementation, och med just de här två dataseten, så spelar det ingen roll om man använder ett primtal som modulo eller inte - man får ungefär samma mängd kollisioner iallafall. (och för övrigt verkar de två hash-funktionerna vara i pincip lika bra, men den som hildenborg postade gör något färre operationer på datan, så kan vara snabbare).
Jag lutar åt att se till att använda power-of-two storlekar för mina hashtabeller, eftersom man då kan göra en bitwise-AND istället för en modulo.
