GetHashCode関数の素数の実装が推奨されていることを確認しました。たとえば、ここにあります。ただし、次のコード(VBでは申し訳ありません)を使用すると、その実装は「ナイーブ」なxor実装と同じハッシュ密度を提供するように見えます。密度が同じである場合、両方の実装で衝突の確率は同じであると思います。なぜプライムアプローチが好まれるのか、私は何かを見逃していますか?
ハッシュコードがバイトの場合、整数の場合の一般性を失うことはないと思います。
Sub Main()
Dim XorHashes(255) As Integer
Dim PrimeHashes(255) As Integer
For i = 0 To 255
For j = 0 To 255
For k = 0 To 255
XorHashes(GetXorHash(i, j, k)) += 1
PrimeHashes(GetPrimeHash(i, j, k)) += 1
Next
Next
Next
For i = 0 To 255
Console.WriteLine("{0}: {1}, {2}", i, XorHashes(i), PrimeHashes(i))
Next
Console.ReadKey()
End Sub
Public Function GetXorHash(ByVal valueOne As Integer, ByVal valueTwo As Integer, ByVal valueThree As Integer) As Byte
Return CByte((valueOne Xor valueTwo Xor valueThree) Mod 256)
End Function
Public Function GetPrimeHash(ByVal valueOne As Integer, ByVal valueTwo As Integer, ByVal valueThree As Integer) As Byte
Dim TempHash = 17
TempHash = 31 * TempHash + valueOne
TempHash = 31 * TempHash + valueTwo
TempHash = 31 * TempHash + valueThree
Return CByte(TempHash Mod 256)
End Function