我已經有一個64位散列函數庫(C編碼),但我只需要48位。我需要將64位散列值修剪爲48位值,但它必須以安全的方式來減少衝突。如何將64位散列值縮短爲48位值?
散列函數是一個很好的64位散列函數。它已經通過SMHasher(「DieHarder」哈希測試)進行了測試,並且證明比Murmur2更好。據我的同事們說,在lib中執行64位哈希的算法是xxHash,使用SMHasher進行了測試,得到了10的Q.Score!對於那些想看到它的人,可以在github.com上找到xxHash的源代碼:github.com/Cyan4973/xxHash/releases/latest。
其基本思想是讓64位散列值(或其中的一部分)中的所有位對生成的48位散列值產生影響。有沒有辦法做到這一點?
[後期編輯]:
所以我已經實現了我自己的48位(準)-UUID發電機。
請在此檢查完整的工作解決方案(包括源代碼):https://stackoverflow.com/a/47895889/4731718。
如果它真的是一個很好的64位散列函數,那麼它基本上是隨機位,所以你可以以任何你喜歡的方式獲取48個散列函數。 –
沒有信息保存在散列碼中,除非你特別使用一些特殊的信息,比如本地敏感散列。總之,你只需選擇最低的48位,就是這樣吧 – HuStmpHrrr
即使它是一個非常好的散列函數,無論你做什麼,你都會失去16位的碰撞安全性。如果你不知道內部結構,你甚至可能會失去超過預期的四分之一的碰撞安全性。 – SkryptX