Je cherche à implémenter une table de hachage rapide et bien distribuée en C #. J'ai du mal à choisir ma fonction de contrainte de hachage qui prend un code de hachage arbitraire et le "contraint" afin qu'il puisse être utilisé pour indexer les compartiments. Il y a deux options que je vois jusqu'à présent:
D'une part, vous pouvez vous assurer que vos compartiments ont toujours un nombre premier d'éléments, et pour contraindre le hachage, vous le modulez simplement par le nombre de compartiments. C'est en fait ce que fait le dictionnaire .NET . Le problème avec cette approche est que l'utilisation de% est extrêmement lente par rapport à d'autres opérations; si vous regardez les tables d'instructions Agner Fog ,
idiv
(qui est le code assembleur généré pour%) a une latence d'instruction de ~ 25 cycles pour les nouveaux processeurs Intel. Comparez cela à environ 3 pourmul
, ou 1 pour les opérations de manipulation de bits commeand
,or
ouxor
.D'un autre côté, le nombre de compartiments peut toujours être une puissance de 2. Vous devrez toujours calculer le module du hachage afin de ne pas tenter d'indexer en dehors du tableau, mais cette fois ce sera moins cher . Étant donné que pour des puissances de 2
% N
est juste& (N - 1)
, la contrainte est réduite à une opération de masquage qui ne prend que 1-2 cycles. Cela se fait par sparsehash de Google . L'inconvénient est que nous comptons sur les utilisateurs pour fournir de bons hachages; masquer le hachage coupe essentiellement une partie du hachage, donc nous ne prenons plus en compte tous les bits du hachage. Si le hachage de l'utilisateur est inégalement réparti, par exemple, seuls les bits supérieurs sont remplis ou les bits inférieurs sont toujours les mêmes, alors cette approche a un taux de collisions beaucoup plus élevé.
Je recherche un algorithme que je peux utiliser qui a le meilleur des deux mondes: il prend en compte tous les bits du hachage et est également plus rapide que l'utilisation de%. Il ne doit pas nécessairement être un module, juste quelque chose qui est garanti d'être dans la plage 0..N-1
(où N est la longueur des godets) et a une distribution uniforme pour tous les emplacements. Un tel algorithme existe-t-il?
Merci pour ton aide.
(2^N +/- 1)
, voir stackoverflow.com/questions/763137/…