我需要散列一些字符串,以便将它们传递到某些库中,这是使用String.hashCode调用直接进行的。
然而,一旦处理完所有内容,我想将hashCode生成的整数转换回String值。我显然可以在其他地方跟踪字符串和哈希码值并在那里进行转换,但我想知道Java中是否会有任何自动执行此操作。
答案 0 :(得分:26)
我认为你误解了哈希的概念。哈希是单向函数。更糟糕的是,两个字符串可能会生成相同的哈希值。
所以不,这是不可能的。
答案 1 :(得分: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);
}
}
答案 2 :(得分:6)
hashCode()
通常不会是bijection,因为它通常不会是injective地图。
hashCode()
以int
为其范围。只有2 ^ 32个不同的int
值,因此对于任何可能有超过2 ^ 32个不同的对象(例如,考虑Long
),您可以得到保证({{{ 3}}至少两个不同的对象将具有相同的哈希码。
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。
答案 3 :(得分:1)
无法将.hashcode()
输出转换为原始表单。这是一个单向的过程。
您可以使用base64 encoder scheme对数据进行编码,在任意位置使用,然后将其解码为原始格式。