Le contexte :
- J'ai une courte liste de cordes.
- Le nombre de cordes n'est pas toujours le même, mais il est presque toujours de l'ordre d'une "poignée".
- Dans notre base de données, nous stockons ces chaînes dans une deuxième table normalisée.
- Ces chaînes sont jamais modifiés une fois qu'ils sont écrits dans la base de données.
Nous souhaitons être en mesure de faire correspondre ces chaînes rapidement dans une requête sans que les performances ne soient affectées par un grand nombre de jointures.
Je pense donc stocker un code de hachage de toutes ces chaînes dans la table principale et l'inclure dans notre index, de sorte que les jointures ne soient traitées par la base de données que lorsque le code de hachage correspond.
Alors comment obtenir un bon code de hachage ? Je pourrais :
- Xor les codes de hachage de toutes les chaînes ensemble
- Xor avec multiplication du résultat après chaque chaîne (disons par 31)
- Rassemblez toutes les chaînes et obtenez le code de hachage.
- D'une autre manière
Alors, qu'en pensent les gens ?
En fin de compte, je me contente de concaténer les chaînes et de calculer le code de hachage pour la concaténation, car c'est simple et cela fonctionne assez bien.
(Si cela vous intéresse, nous utilisons .NET et SqlServer)
Bug !, Bug !
Citation des directives et règles pour GetHashCode par Eric Lippert
La documentation de System.String.GetHashCode note spécifiquement que deux chaînes identiques identiques peuvent avoir des codes de hachage différents dans différentes versions du CLR, et en fait, c'est le cas. Ne stockez pas de chaînes dans des bases de données et ne vous attendez pas à ce qu'ils qu'ils soient toujours les mêmes, car ils car ce ne sera pas le cas.
Donc String.GetHashcode() ne doit pas être utilisé pour cela.
0 votes
Voir aussi stackoverflow.com/questions/5154970/