2012-12-10 114 views
0

我有兩個字符串在單獨的處理階段被哈希成ulong(使用Google的CityHash),現在必須將這兩個哈希合併爲一個新的哈希,而不會顯着增加哈希碰撞的風險。將兩個ulong哈希組合到新的ulong哈希中

我知道XOR有一些問題(如價值^ 0 =值),但考慮到兩個輸入值應該已經被分流,我懷疑我可以結合哈希像

ulong hash = hash1^hash2; // hash1 and hash2 are ulong hashes of strings 

這種方法有什麼問題嗎?還是有更好的方法,不會增加顯着的計算開銷?

+0

爲什麼這個標記爲* cryptography *?我的spidey感是刺痛的! –

+0

@NikBougalis:因爲哈希應該符合密碼分配標準。不用擔心,我不會混淆加密和散列:-) –

+0

只是馬金肯定;) –

回答

1

基於@ GregS的評論和我自己的進一步閱讀,我相信我不會嚴重降低散列分佈使用簡單的XOR。

這是最明智的方法。

+0

嗯,這要看情況。如果你想讓「ab」的結果與「ba」的結果相同,那就OK了。如果你希望他們不同於你至少不得不轉移/繁殖其中一個合作伙伴。 – wildplasser

+0

@wildplasser:鑑於散列分佈的其他特點,我認爲這不是問題。當操作數具有比散列大小小得多的通常範圍(例如,當對屏幕上的X,Y座標進行散列/圖形時),這更可能成爲問題。 –

1

boost庫以相當簡單的方式執行此操作。

您可能需要計算64位的黃金數字。

計算將是:

ulong hash = hash1^(hash2 + 0x9e3779b9 + (hash1 << 6) + (hash1 >> 2); 

數0x9e3779b9是2^32/PHI我相信。 Phi是黃金比例。無理數的劃分試圖以確定性的方式增加「隨機性」。

+0

這並不壞,但這個短小的東西不應該用在任何需要加密安全散列的地方。 –

+0

爲什麼hash1的左右移位?這個移位量是否適合64位數字?你有沒有參考「提升」的方式? –

+0

http://www.boost.org/doc/libs/1_35_0/doc/html/boost/hash_combine_id241013.html –