我需要散列一些字符串,以便我可以将它们传递到某些库中,这是使用String.hashCode调用直接进行的.
但是,一旦处理完所有内容,我想将hashCode生成的整数转换回String值.我显然可以在其他地方跟踪字符串和哈希码值并在那里进行转换,但我想知道Java中是否会有任何自动执行此操作的内容.
这一般是不可能的.该hashCode是什么人会称之为单向函数.
此外,字符串多于整数,因此存在从整数到字符串的一对多映射.的字符串"0-42L"和"0-43-"例如,具有相同的哈希码.(在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);
}
}
Run Code Online (Sandbox Code Playgroud)
hashCode()通常不会是一个双射,因为它通常不会是一个内射映射.
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.