我需要散列一些字符串,以便將它們傳遞到某些庫中,這是使用String.hashCode調用的簡單方法。將字符串轉換爲散列值,然後再重新設置字符串
但是,一旦一切都被處理,我想將hashCode生成的整數轉換回String值。我顯然可以跟蹤其他地方的字符串和哈希碼值,並在那裏進行轉換,但是我想知道Java中有沒有什麼能夠自動完成這一點。
我需要散列一些字符串,以便將它們傳遞到某些庫中,這是使用String.hashCode調用的簡單方法。將字符串轉換爲散列值,然後再重新設置字符串
但是,一旦一切都被處理,我想將hashCode生成的整數轉換回String值。我顯然可以跟蹤其他地方的字符串和哈希碼值,並在那裏進行轉換,但是我想知道Java中有沒有什麼能夠自動完成這一點。
我想你誤解了散列的概念。哈希是一種單向函數。更糟糕的是,兩個字符串可能會生成相同的散列。
所以不行,這是不可能的。
另外,這首先是散列的一點。 – 2010-10-29 10:51:11
這是不可能的一般。 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);
}
}
如果您需要進行反向查找,則此方法的一個補充可能是使用BiDiMap(http://commons.apache.org/collections/api-3.1/org/apache/commons/collections/BidiMap.html)。只是要小心散列碰撞.. :) – posdef 2010-10-29 09:30:00
這將是最好使用地圖<整數,列表
這是一個很好的觀點。但是他仍然不得不在猜測字符串'List
不可能將.hashcode()
輸出轉換爲原始格式。這是一個單向過程。
您可以使用base64 encoder scheme,您將在其中編碼數據,將其用於任何您想要的位置,然後將其解碼爲原始形式。
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)
和a
和b
都是你的類的對象,那麼你將在(對等的類)對象和哈希代碼之間具有雙射。 (例如,Integer
類可以這樣做。)
但是,除非您處於這種特殊情況,否則您應該以其他方式創建一個唯一的ID。
+1提出了鴿子的原則。 – ArtOfWarfare 2012-08-27 18:23:04
您可以使用加密或編碼/解碼(也許base64)。 – jerjer 2010-10-29 09:52:14