我正在尝试将我在logacat文件中收到的哈希码值转换为字符串表示。
我试过下面的代码。
final Element e = (Element)nodes_array.item(index);
final NodeList nodeKey = e.getElementsByTagName("key");
System.out.println(" $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"+nodeKey.item(1).toString());
并在logcat文件中得到以下输出-
I/System.out(919): $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$org.apache.harmony.xml.dom.ElementImpl@b2dd54a0
不,那不可能。哈希是一种单向转换——一旦某些东西被哈希,就没有办法恢复原始信息。
哈希码的概念是,多个对象可能具有相同的哈希码。
例如:
String first = "ABCDEa123abc";
String second = "ABCDFB123abc";
计算字符串哈希码的公式如下:
S0 X 31 ^ (n-1) + S1 X 31 ^ (n-2) + .... + S(n-2) X 31 + S(n-1)
其中S
表示字符串中的字符,n
表示字符串的长度。
这个公式不保证每个字符串有唯一的哈希码。
"ABCDEa123abc"
和"ABCDFB123abc"
具有相同的哈希码,但由于它们的字符序列不同而不相等。
结果如下-
int hash1 ="ABCDEa123abc".hashCode();
int hash2 = "ABCDFB123abc".hashCode();
注意:hash1和hash2是相等的但是两个字符串是不相等的。
所以hashcode不能唯一标识字符串。
作为记录,
对于
equals()
和hashCode()
,如果equals()
对于两个对象返回true,例如'a'
和'b'
,然后是它们的哈希码必须相同。但是,它进一步说明了哈希码需要不不同,如果equals()
返回false。
更新:
就像您通过执行Object.toString()
获得对象的哈希码一样,您可以通过执行-
System.out.println(Integer.toHexString(s.hashCode()));
查看Hashcode的详细信息-
the-3-things-you-should-know-about-hashcode 。