我需要对一些字符串进行哈希处理,以便将它们传递给某些库。使用String.hashCode调用可以很容易地完成此操作。
但是,一旦所有内容被处理完毕,我想将从hashCode生成的整数转换回原来的字符串值。显然,我可以在其他地方跟踪字符串和哈希代码值并在那里执行转换,但我想知道Java中是否有任何自动执行此操作的东西。
我认为你误解了哈希的概念。哈希是一个单向函数。更糟糕的是,两个字符串可能会生成相同的哈希值。
所以,不,这是不可能的。
Integer.hashCode
就会出问题。 - aioobehashCode()
通常不会是一个双射,因为它通常不会是一个单射映射。
hashCode()
的范围是int
。只有2^32个不同的int
值,所以对于任何对象,如果有超过2^32个不同的对象(例如,考虑Long
),你可以保证(通过鸽巢原理)至少有两个不同的对象将具有相同的哈希码。
hashCode()
给你的唯一保证是,如果a.equals(b)
,那么a.hashCode() == b.hashCode()
。每个对象具有相同的哈希码都与此一致。
hashCode()
在某些非常有限的情况下唯一标识对象:必须有一个特定的类,其中没有超过2^32个可能不同的实例(即,最多有2^32个对象属于您的类,它们成对这样!a.equals(b)
)。在这种情况下,只要确保每当!a.equals(b)
且a
和b
都是您的类的对象时,a.hashCode()!= b.hashCode()
,则会在对象和哈希码之间具有双射(等价类)。 (例如,可以为Integer
类执行此操作。)
但是,除非您处于这种非常特殊的情况,否则应通过其他方式创建唯一ID。
"0-42L"
和"0-43-"
具有相同的哈希值。(ideone.com上的演示。)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);
}
}
List<String>
字符串中猜测哪些对应于特定的哈希码。 - aioobe