簡答
不要這樣做。使用Java地圖。你可以在這裏找到細節: http://docs.oracle.com/javase/6/docs/api/java/util/Map.html
長的答案
您可以通過將您的字符串作爲基礎-N的數,其中N是所有可能的值的任何字符可以創造一個完美的散列函數上。這裏的問題是內存。散列函數意味着與數組一起使用,這意味着您需要一個足夠大的數組來處理散列結果,這是不切實際的。
例如,以10個字符的鍵爲例。讓我們更謙虛,並假設他們保證只包含小寫字母。這給你26個可能性,每個角色和10個字符。這意味着可能的組合有:
26^10 = 141,167,095,653,376
如果你看看散列算法,它們包括第一件事就是碰撞檢測,因爲他們認識到,衝突是生活中的事實。
現在你說你沒有在內存中加載密鑰,但你爲什麼要使用哈希呢?散列的一點是給你一個映射到數組索引。也許你最好使用另一種機制。
可能的解決方案
如果您擔心內存,得到重複的一些統計數據在您的文件。如果您只存儲一個標誌來指示哈希中某個特定鍵的出現,並且您有很多重複項,那麼您可以使用Java的地圖。 Java的映射處理衝突,所以不會阻止你檢測唯一的密鑰。您可以放心,如果找到A [x],那就意味着x在A中,即使x的散列與先前的散列相沖突。
接下來,您可以嘗試一些實用程序來提取重複項。由於它們是專門爲此目的而編寫的,因此它們應該能夠處理大量的數據。
最後,您可以嘗試將條目放入數據庫並使用它處理重複項。這可能看起來像是矯枉過正,但數據庫針對處理大量記錄進行了優化。
在unix中你會做'cat $ files |排序| uniq -c'會給你許多文件中每行的數量。你可以解析這個來獲取重複。 –
我不認爲完美的哈希是解決方案。構建一個完美的散列本身需要訪問所有的字符串,並且可能比檢測重複項更有效。 –