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

Ste*_*eve 11 java hash

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

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

Car*_*rra 27

我认为你误解了哈希的概念.哈希是单向函数.更糟糕的是,两个字符串可能会生成相同的哈希.

所以不,这是不可能的.


aio*_*obe 7

这一般是不可能的.该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)


uck*_*man 6

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)两者ab是你的类的对象,即a.hashCode() != b.hashCode(),你将有(的等价类)对象和散列码之间的一一对应.(Integer例如,对于班级,可以这样做.)

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