代码之家  ›  专栏  ›  技术社区  ›  Steve

将字符串转换为哈希值,然后稍后重新设置字符串

  •  11
  • Steve  · 技术社区  · 14 年前

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

    但是,在处理完所有内容后,我希望将哈希代码生成的整数转换回字符串值。很明显,我可以在其他地方跟踪字符串和hashcode值并在那里进行转换,但我想知道Java中是否有任何东西可以自动完成这项工作。

    4 回复  |  直到 14 年前
        1
  •  27
  •   Carra    14 年前

    我想你误解了杂烩的概念。散列是单向函数。更糟糕的是,两个字符串可能会生成相同的散列。

    所以不,不可能。

        2
  •  7
  •   aioobe    14 年前

    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);
        }
    }
    
        3
  •  6
  •   uckelman    14 年前

    hashCode() 一般来说 bijection ,因为一般来说 injective 地图。

    哈希代码() int s为其范围。只有2^32个不同 值,因此对于任何可能有超过2^32个不同值的对象(例如,考虑 Long ),你有保证 pigeonhole principle 至少两个不同的对象将具有相同的哈希代码。

    唯一的保证 哈希代码() a.equals(b) ,然后 a.hashCode() == b.hashCode()

    可以 使用 在某些非常有限的情况下唯一地标识对象:您必须有一个特定的类,其中不超过2^32个可能的不同实例(即,类中最多有2^32个对象成对出现 !a.equals(b) ). 在这种情况下,只要你保证 !a、 等于(b) a b 是你的类对象 a.hashCode() != b.hashCode() ,对象和散列代码之间将有一个双射。(可以这样做 Integer

    但是,除非您在这种特殊情况下,否则应该以其他方式创建唯一的id。

        4
  •  1
  •   zengr    14 年前

    .hashcode() 输出到原始表单。这是一个单向的过程。

    base64 encoder scheme 在编码数据的地方,可以在任何需要的地方使用它,然后将其解码为原始形式。