Ma façon habituelle de créer un code de hachage pour un ensemble arbitraire d'éléments hachables :
int hash = 23;
hash = hash * 31 + item1Hash;
hash = hash * 31 + item2Hash;
hash = hash * 31 + item3Hash;
hash = hash * 31 + item4Hash;
hash = hash * 31 + item5Hash;
// etc
Dans votre cas item1Hash
pourrait juste être a
y item2Hash
pourrait juste être b
.
Les valeurs de 23 et 31 sont relativement peu importantes, du moment qu'il s'agit de nombres premiers (ou au moins copieurs).
Bien sûr, il y aura toujours des collisions, mais vous ne rencontrerez pas les problèmes désagréables habituels :
hash(a, a) == hash(b, b)
hash(a, b) == hash(b, a)
Si vous en savez plus sur ce que sont les valeurs réelles de a
y b
vous pouvez probablement faire mieux, mais il s'agit d'une bonne implémentation initiale, facile à mémoriser et à mettre en œuvre. Notez que s'il y a une chance que vous construisiez l'assemblage avec "check for arithmetic overflow/underflow" coché, vous devriez mettre tout cela dans un bloc non coché. (Le débordement est parfait pour cet algorithme).