2010-10-29 122 views
11

我需要散列一些字符串,以便將它們傳遞到某些庫中,這是使用String.hashCode調用的簡單方法。將字符串轉換爲散列值,然後再重新設置字符串

但是,一旦一切都被處理,我想將hashCode生成的整數轉換回String值。我顯然可以跟蹤其他地方的字符串和哈希碼值,並在那裏進行轉換,但是我想知道Java中有沒有什麼能夠自動完成這一點。

+1

您可以使用加密或編碼/解碼(也許base64)。 – jerjer 2010-10-29 09:52:14

回答

25

我想你誤解了散列的概念。哈希是一種單向函數。更糟糕的是,兩個字符串可能會生成相同的散列。

所以不行,這是不可能的。

+1

另外,這首先是散列的一點。 – 2010-10-29 10:51:11

7

這是不可能的一般。 hashCode就是所謂的one-way-function

此外,字符串比整數多,所以存在從整數到字符串的一對多映射。例如,字符串"0-42L""0-43-"具有相同的散列碼。 (Demonstration on ideone.com.

可以做然而,(作爲估計),會是怎樣來存儲您傳遞到API中的字符串,並記住他們的哈希碼是這樣的:

import java.util.*; 

public class Main { 
    public static void main(String[] args) { 

     // Keep track of the corresponding strings 
     Map<Integer, String> hashedStrings = new HashMap<Integer, String>(); 

     String str1 = "hello"; 
     String str2 = "world"; 

     // Compute hash-code and remember which string that gave rise to it. 
     int hc = str1.hashCode(); 
     hashedStrings.put(hc, str1); 

     apiMethod(hc); 

     // Get back the string that corresponded to the hc hash code. 
     String str = hashedStrings.get(hc); 
    } 
} 
+0

如果您需要進行反向查找,則此方法的一個補充可能是使用BiDiMap(http://commons.apache.org/collections/api-3.1/org/apache/commons/collections/BidiMap.html)。只是要小心散列碰撞.. :) – posdef 2010-10-29 09:30:00

+0

這將是最好使用地圖<整數,列表>。這樣你可以將你的哈希映射到相應的字符串,因爲它們可以是多個。 – Carra 2010-10-29 09:32:49

+0

這是一個很好的觀點。但是他仍然不得不在猜測字符串'List '中對應某個哈希碼。 – aioobe 2010-10-29 11:33:09

1

不可能將.hashcode()輸出轉換爲原始格式。這是一個單向過程。

您可以使用base64 encoder scheme,您將在其中編碼數據,將其用於任何您想要的位置,然後將其解碼爲原始形式。

6

hashCode()通常不會是bijection,因爲它通常不會是injective地圖。

hashCode()具有int s作爲其範圍。只有2^32個不同的值,因此對於任何可能存在超過2^32個不同的對象的任何對象(例如,考慮Long),保證(通過pigeonhole principle,至少兩個不同的對象將具有相同的散列碼。

hashCode()給你的唯一保證的是,如果a.equals(b),然後a.hashCode() == b.hashCode(),具有相同的散列碼中的每個對象是與此一致。

可以使用hashCode()唯一標識對象在一些非常有限的情況下:你必須有一個特定的班級,在沒有任何mor的地方e比2^32個可能的不同情況(即,你的班級至多有2^32個對象,它們的配對是!a.equals(b))。在這種情況下,只要你確保每當!a.equals(b)ab都是你的類的對象,那麼你將在(對等的類)對象和哈希代碼之間具有雙射。 (例如,Integer類可以這樣做。)

但是,除非您處於這種特殊情況,否則您應該以其他方式創建一個唯一的ID。

+0

+1提出了鴿子的原則。 – ArtOfWarfare 2012-08-27 18:23:04

相關問題