Я видел, что рекомендуется использовать реализацию функции 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