哈希函數我需要一個散列函數(字節),其絃樂
具有較低的碰撞率(即使是很短的字符串)的字符串
可以快速計算(
O(n)
時間是必須的,但我希望它儘可能快)鑑於
hash(string1)
和hash(string2)
,計算hash(append(string1, string2))
可以O(1)
完成。
我能想出迄今最好的是這樣的:(在Java中的僞代碼)
public static int[] HASH_ENTROPY = new int[] {...} // 255 large prime numbers
public int hash()
int hash = 0;
for (int i=0; i < this.array.length; i++)
hash += HASH_ENTROPY[this.array[i] + 128];
return hash;
是否有更好的算法?這一個執行#1和#3,但我想知道 如果它太慢必須訪問數組中的隨機元素。
這與RSA和其他類似的方法並不是不一樣的,而不是隻是'大'的素數,你可以使用與許多事情相關的質數(即3,17等)。我知道Ramanujan也出現了有一個非常好的散列數(不能想象它離開我的頭頂)。 –
該算法是順序無關的,這意味着anagrams會發生碰撞;這似乎與慾望#1相矛盾,儘管通過依賴訂單的散列算法使#3變得如此之快是非常棘手的。我真的不認爲查詢熵值的速度很重要,但另一方面,自那以後,它們也沒有太大的幫助。 – rici
@nikdeapen爲什麼你使用哈希(安全或查找)的目的?什麼是所需的哈希鍵長度? –