将字符串转换为散列值,然后再重新设置字符串

问题描述:

我需要散列一些字符串,以便将它们传递到某些库中,这是使用String.hashCode调用的简单方法。将字符串转换为散列值,然后再重新设置字符串

但是,一旦一切都被处理,我想将hashCode生成的整数转换回String值。我显然可以跟踪其他地方的字符串和哈希码值,并在那里进行转换,但是我想知道Java中有没有什么能够自动完成这一点。

+1

您可以使用加密或编码/解码(也许base64)。 – jerjer 2010-10-29 09:52:14

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

所以不行,这是不可能的。

+1

另外,这首先是散列的一点。 – 2010-10-29 10:51:11

这是不可能的一般。 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); 
    } 
} 
+0

如果您需要进行反向查找,则此方法的一个补充可能是使用BiDiMap(http://commons.apache.org/collections/api-3.1/org/apache/commons/collections/BidiMap.html)。只是要小心散列碰撞.. :) – posdef 2010-10-29 09:30:00

+0

这将是最好使用地图>。这样你可以将你的哈希映射到相应的字符串,因为它们可以是多个。 – Carra 2010-10-29 09:32:49

+0

这是一个很好的观点。但是他仍然不得不在猜测字符串'List '中对应某个哈希码。 – aioobe 2010-10-29 11:33:09

不可能将.hashcode()输出转换为原始格式。这是一个单向过程。

您可以使用base64 encoder scheme,您将在其中编码数据,将其用于任何您想要的位置,然后将其解码为原始形式。

hashCode()通常不会是bijection,因为它通常不会是injective地图。

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

hashCode()给你的唯一保证的是,如果a.equals(b),然后a.hashCode() == b.hashCode(),具有相同的散列码中的每个对象是与此一致。

可以使用hashCode()唯一标识对象在一些非常有限的情况下:你必须有一个特定的班级,在没有任何mor的地方e比2^32个可能的不同情况(即,你的班级至多有2^32个对象,它们的配对是!a.equals(b))。在这种情况下,只要你确保每当!a.equals(b)ab都是你的类的对象,那么你将在(对等的类)对象和哈希代码之间具有双射。 (例如,Integer类可以这样做。)

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

+0

+1提出了鸽子的原则。 – ArtOfWarfare 2012-08-27 18:23:04