Hashcode总是一样的?

时间:2014-12-12 02:07:49

标签: c#

我想知道HashCode是否总是一样的。?

例如:

String myString = "my super string";
Int myHashCode = myString.GetHashCode();

myHashCode总是相同的值吗?在任何计算机上,任何时间,任何一切?

我是否可以信赖它,将其用作自定义唯一标识(对于相同的对象类型)

2 个答案:

答案 0 :(得分:5)

不,该值可以在计算机和基本系统版本之间更改。

在给定的程序运行期间,你应该只依赖它来保持不变。

来自documentation

  

GetHashCode返回的值与平台有关。它在32位和64位版本的.NET Framework上有所不同。它也可以在.NET Framework版本之间有所不同。

     

警告:哈希代码用于在基于哈希表的集合中进行有效插入和查找。哈希码不是永久值。出于这个原因:

     
      
  • 不要序列化哈希码值或将它们存储在数据库中。
  •   

  

我是否可以信赖它,将其用作自定义唯一标识?

即使在单个程序运行期间,它也不会起作用,因为哈希码会发生冲突(不等对象的哈希码相同)。

再次引用文档:

  
      
  • 不测试哈希码的相等性以确定两个对象是否相等。 (不等的对象可以具有相同的哈希码。)要测试相等性,请调用ReferenceEquals或Equals方法。
  •   

答案 1 :(得分:2)

根据文件:

如果两个字符串对象相等,则GetHashCode方法返回相同的值。但是,每个唯一字符串值都没有唯一的哈希码值。不同的字符串可以返回相同的哈希码。 哈希码本身并不保证稳定。对于单个版本的.NET Framework,不同版本的.NET Framework和跨平台(例如32位和64位)的相同字符串的哈希代码可能不同。在某些情况下,它们甚至可能因应用领域而异。 因此,哈希代码永远不应该在创建它们的应用程序域之外使用,它们永远不应该用作集合中的关键字段,并且永远不应该保留它们。

散列码是从字符串的值派生的,而其他对象则是从内存位置派生的。

它可以为不同的字符串生成相同的哈希码,因为可能会发生冲突,因此拇指规则从不使用哈希码作为密钥,因为它们发生了变化,这里是关于哈希码的一个很好的来源:

http://eclipsesource.com/blogs/2012/09/04/the-3-things-you-should-know-about-hashcode/