将字符串转换为哈希,然后再改写字符串

时间:2010-10-29 09:16:17

标签: java hash

我需要散列一些字符串,以便将它们传递到某些库中,这是使用String.hashCode调用直接进行的。

然而,一旦处理完所有内容,我想将hashCode生成的整数转换回String值。我显然可以在其他地方跟踪字符串和哈希码值并在那里进行转换,但我想知道Java中是否会有任何自动执行此操作。

4 个答案:

答案 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)以及ab都是您班级的对象a.hashCode() != b.hashCode()时,您就会在两者之间产生双性对象和哈希码的类。 (例如,对于Integer类,可以这样做。)

但是,除非你处于这种非常特殊的情况,否则你应该以其他方式创建一个唯一的id。

答案 3 :(得分:1)

无法将.hashcode()输出转换为原始表单。这是一个单向的过程。

您可以使用base64 encoder scheme对数据进行编码,在任意位置使用,然后将其解码为原始格式。