我想知道HashCode是否总是一样的。?
例如:
String myString = "my super string";
Int myHashCode = myString.GetHashCode();
myHashCode
总是相同的值吗?在任何计算机上,任何时间,任何一切?
我是否可以信赖它,将其用作自定义唯一标识(对于相同的对象类型)
答案 0 :(得分:5)
不,该值可以在计算机和基本系统版本之间更改。
在给定的程序运行期间,你应该只依赖它来保持不变。
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/