2012-04-22 62 views
3

我有一個長度爲128個字符(意味着128個數字0/1)的布爾字符串(如「01100..001」)。我正在Java中尋找一個高效的(快速)散列函數,它產生的表達式低於128位,顯然衝突較少。任何人都可以幫助我,有沒有這樣的散列函數?任何建議?Java最快的散列函數

+3

碰撞比你用128位表示得到的零更少嗎? – eggyal 2012-04-22 17:15:05

+0

@eggyal,非常感謝。好概念。它會幫助我很多。 :) – Arpssss 2012-04-22 17:27:28

+0

使用字符串僅僅存儲128位值似乎對我來說有點矯枉過正,浪費內存,特別是如果你關心性能,絕對不是最好的選擇。 – MRalwasser 2012-04-22 17:41:49

回答

5

嘗試在Java類String上使用.hashCode()方法,它返回一個int,它非常快。

或者你可以使用.hashCode()方法上java.util.BitSet作爲脈衝星建議,如果你喜歡存放在BitSet您的數據。

+0

我想說的是,除了我會先將'String'轉換爲'BigInteger'併爲此調用'.hashCode()'方法。但我猜測只是像你所建議的那樣散列原始的'String'就更快了。只是想知道爲什麼你想要將16個字節存儲爲128字節的'String',這看起來像是一個巨大的空間浪費。 – ZeroOne 2012-04-22 17:20:59

+0

非常感謝。這將是一個很好的嘗試。但是,是否有任何文件說明碰撞的可能性? – Arpssss 2012-04-22 17:26:08

+0

@ZeroOne,我也想把它轉換成BigInt,然後調用哈希碼。因爲,我認爲這會減少碰撞。 – Arpssss 2012-04-22 17:30:59

7

您是否考慮過使用java.util.BitSet來代替,取決於您在做什麼,這可能會更容易,更高效? http://docs.oracle.com/javase/6/docs/api/java/util/BitSet.html 它也有一個.hashCode()方法。

+0

非常感謝。這將是一個很好的嘗試。但是,是否有任何文件說明碰撞概率? – Arpssss 2012-04-22 17:25:34

+0

不是我所知道的。我知道它在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

1

如果您需要計算字符串的散列,只需使用String類的hashCode()方法。根據實施情況,可以進行多次優化以快速計算此值。

作爲一個例子,在OpenJDK的實施StringhashCode()方法的緩存在hash屬性的值,而只需要計算一次。

誰說128個字符的字符串有128位的散列? Java中hashCode()方法返回的所有哈希類型爲int,Java中的int使用32位表示。