2 shuai wy shuai_wy 于 2017.01.12 14:48 提问

C# HashCode转回字符串

字符串“北京”转成HashCode有两个值,有时候是321841321,有时候798348351,
我想把HashCode转回字符串,应该怎样实现

2个回答

caozhy
caozhy   Ds   Rxr 2017.01.12 15:05
已采纳

经常面试让你证明,为什么hash算法是不可逆的。
证明如下:
字符串可以是“北京”,也可以“中华人民共和国北京市海淀区”。字符串有无穷多个不同的值。
hash的长度是0-9999999999,只有这么多可能性。
将无限集合映射到一个有限元素集合,结果必然是一个hash对应无穷多原始的数据。
所以没法转换。证明完毕。
像这种问题都搞不清楚的,一般我们都不招的好吧。

caozhy
caozhy 回复精神病人思路广_: 根据语言规范,只能保证hash在程序一次运行的一个实例里,相同的值对应相同的hash,不同的值hash可以相同可以不同。不保证两次程序运行,或者不同平台/语言的运行,hash相同
一年多之前 回复
shuai_wy
shuai_wy 那么问题中,北京有了两个值的原因是什么呐?空格?
一年多之前 回复
shuai_wy
shuai_wy 哈哈哈,厉害了,我就想知道,您是给CSDN找人吗?
一年多之前 回复
oyljerry
oyljerry   Ds   Rxr 2017.01.12 14:54

HashCode是不可逆的,你只能比较两个字符串的HashCode是否相等来判断字符串是否相同,而不能直接反推出字符串

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C#中有关string.GetHashCode()的一个重要注意事项!
最近在做项目的时候,需要把字符串存入数据库,并且要求数据库中不能有重复的字符串,由此就引出了将字符串hash成特定的hash值,依靠查询hash值是否重复来判断字符串是否重复。 这样做的好处在于查询重复字符串的代价太大,因为字符串可能会非常长,进行逐个比较非常消耗数据库的性能,如果将字符串hash之后,依靠hash值来查重就显得轻便很多了,因为hash值通常都比字符串本身短很多。
C#重写GetHashCode()
当你想要重写Equals()时,也应该同时重写GetHashCode()。若忘记此操作,编译器显示警告:在将类作为散列表集合(比如System.Collections.Hashtable和System.Collections.Generic,Dictionary)的键(key)使用时,最好也将GetHash()重写
C#——详析GetHashCode方法
GetHashCode函数一般是在操作HashTable或者Dictionary之类的数据集的时候被调用,目的是产生一个Key,为了方便在 HashTable或者 Dictionary中的检索。 每个类型,不管是值类型还是引用类型,都提供这个基本函数,同样也可以像重写ToString或者Equals函数一样去重写它。但是不建议重写此函数,而且在使用这个函数也需要加倍小心。  
避免hashcode重复
众所周知,Java中如果用String的hashcode作为key,将String保存到HashSet中,这样做是不太可靠的。原因就在于,String的hashcode有可能会重复。比如有这样一个场景,一个网络爬虫需要将所有爬取过的URL保存下来,以便于判断新获取的URL是否已经被访问过,这时就需要有一块内存空间来保存URL,或是保存能够唯一标识URL的ID,比如URL的MD5值或hashcode
hashcode与字符串
问题1. 不同的字符串可能会有相同的HashCode吗? 答案: 可能。hashcode是用来判断两个字符串是否相等的依据,不同的字符串不可能有相同的hashcode,但不同的hashCode经过与长度的取余,就很可能产生相同的hashCode,就是所谓的哈希冲突. 如: 延伸问题: hashcode相同,字符串相同吗?答案是不一定。 问题2. 相同的字符串可能会
java字符串的hashCode
最近看到一篇关于hashCode的值的问题,提到使用hashCode比较字符串相等的问题。 看了源码,如下: int h = hash; int len = count; if (h == 0 && len > 0) { int off = offset; char val[] = value; for (int i = 0; i
Java 中String的HashCode计算方法
/**      * Returns a hash code for this string. The hash code for a      * String object is computed as      *       * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]      *       * usi
关于hashCode,你一定听说过会重复,那么你见过2个不同的字符串hashCode值却是相同的吗
java中String.hashCode()方法的算法如下:str.charAt(0) * 31n-1 + str.charAt(1) * 31n-2 + ... + str.charAt(n-1)据说算法中31这个数字是对英文字符进行优化后产生的一个最佳数字,但是碰上字母大小写或是一些特殊字符,再或者是中文字符,它就不灵了,很容易重复,举个例子:Stringa="Aa";Stringb="BB"...
Java构建HashCode相同字符串算法
import java.math.BigDecimal; import java.util.Random; /** * “中间相遇法”是生日攻击的一种变形,它不比较Hash值,而是比较链中的中间变量。这种攻击主要适用于攻击具有分组链结构的Hash方案。 * 中间相遇攻击的基本原理为 * :将消息分成两部分,对伪造消息的第一部分从初试值开始逐步向中间阶段产生r1个变量;对伪造消息的第二部分从
字符串hash函数(hashCode的生成)
非常好的外文网站!!!: General Purpose Hash Function Algorithms http://www.partow.net/programming/hashfunctions/#top 最终结果: 1.  BKDRHash 2.  ************** Java 版: 今天根据自己的理解重新整理了一下几