将字符串转换为散列值,然后再重新设置字符串
我需要散列一些字符串,以便将它们传递到某些库中,这是使用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
这将是最好使用地图>。这样你可以将你的哈希映射到相应的字符串,因为它们可以是多个。 – Carra 2010-10-29 09:32:49
这是一个很好的观点。但是他仍然不得不在猜测字符串'List
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