我有一個長度爲128個字符(意味着128個數字0/1)的布爾字符串(如「01100..001」)。我正在Java中尋找一個高效的(快速)散列函數,它產生的表達式低於128位,顯然衝突較少。任何人都可以幫助我,有沒有這樣的散列函數?任何建議?Java最快的散列函數
回答
嘗試在Java類String
上使用.hashCode()
方法,它返回一個int
,它非常快。
或者你可以使用.hashCode()
方法上java.util.BitSet
作爲脈衝星建議,如果你喜歡存放在BitSet
您的數據。
我想說的是,除了我會先將'String'轉換爲'BigInteger'併爲此調用'.hashCode()'方法。但我猜測只是像你所建議的那樣散列原始的'String'就更快了。只是想知道爲什麼你想要將16個字節存儲爲128字節的'String',這看起來像是一個巨大的空間浪費。 – ZeroOne 2012-04-22 17:20:59
非常感謝。這將是一個很好的嘗試。但是,是否有任何文件說明碰撞的可能性? – Arpssss 2012-04-22 17:26:08
@ZeroOne,我也想把它轉換成BigInt,然後調用哈希碼。因爲,我認爲這會減少碰撞。 – Arpssss 2012-04-22 17:30:59
您是否考慮過使用java.util.BitSet
來代替,取決於您在做什麼,這可能會更容易,更高效? http://docs.oracle.com/javase/6/docs/api/java/util/BitSet.html 它也有一個.hashCode()
方法。
非常感謝。這將是一個很好的嘗試。但是,是否有任何文件說明碰撞概率? – Arpssss 2012-04-22 17:25:34
不是我所知道的。我知道它在2004年得到了改進(請參閱bug遊行:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4979028)和java doc show(定義了?)如何計算哈希代碼:源代碼當然也可以使用。 http://docs.oracle.com/javase/6/docs/api/java/util/BitSet.html#hashCode() – 2012-04-23 15:24:26
如果您需要計算字符串的散列,只需使用String
類的hashCode()
方法。根據實施情況,可以進行多次優化以快速計算此值。
作爲一個例子,在OpenJDK的實施String
類hashCode()
方法的緩存在hash
屬性的值,而只需要計算一次。
誰說128個字符的字符串有128位的散列? Java中hashCode()
方法返回的所有哈希類型爲int
,Java中的int使用32位表示。
碰撞比你用128位表示得到的零更少嗎? – eggyal 2012-04-22 17:15:05
@eggyal,非常感謝。好概念。它會幫助我很多。 :) – Arpssss 2012-04-22 17:27:28
使用字符串僅僅存儲128位值似乎對我來說有點矯枉過正,浪費內存,特別是如果你關心性能,絕對不是最好的選擇。 – MRalwasser 2012-04-22 17:41:49