c# - 具有两个Int16的C#GetHashCode,还最多返回Int32吗?

标签 c# hash int gethashcode int32

对不起,将两个问题组合为一个,它们是相关的。

HashCode表示HashSet等。据我了解,它们必须是唯一的,不能更改,并且将对象的任何配置表示为单个数字。

我的第一个问题是,对于包含两个Int16s ab的对象,我的GetHashCode是否可以安全地返回类似a * n + b的东西,其中n是一个大数字,我想也许是Math.Pow(2, 16)吗?

同样,GetHashCode似乎不灵活地返回Int32类型。

例如32位可以存储两个Int16,一个单一的Unicode字符或16 N,S,E,W指南针方向,这并不多,即使像少数几个节点图这样的东西也可能太多了。这是否代表C#哈希收集的限制?

最佳答案

据我了解,它们必须是唯一的


不。对于大多数类型来说,它们可能不是唯一的,它们可能具有超过232个可能的值。理想情况下,如果两个对象具有相同的哈希码,则它们不太可能相等-但您永远不应假定它们相等。重要的一点是,如果它们具有不同的哈希码,则它们肯定是不相等的。


  我的第一个问题是,对于包含两个Int16s a和b的对象,我的GetHashCode是否可以安全地返回a * n + b,其中n是一个大数字,我想也许是Math.Pow(2,16) 。


如果仅包含两个Int16值,则使用起来最简单:

return (a << 16) | (ushort) b;


然后,该值将是唯一的。哎呀!


  同样,GetHashCode似乎不灵活地返回类型Int32


是。诸如DictionaryHashSet之类的类型必须能够使用固定大小,以便它们可以与其一起使用以将值放入存储桶中。


  例如32位可以存储两个Int16,一个单一的Unicode字符或16 N,S,E,W指南针方向,这并不多,即使像少数几个节点图这样的东西也可能太多了。这是否代表C#哈希收集的限制?


如果这是一个限制,那将是.NET限制而不是C#限制-否,这仅仅是对哈希码代表什么的误解。

埃里克·利珀特(Eric Lippert)具有出色的(很明显)的blog post about GetHashCode,您应该阅读它以获取更多信息。

关于c# - 具有两个Int16的C#GetHashCode,还最多返回Int32吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10156059/

相关文章:

linux - 如何在目录和子目录的文件中递归搜索模式并生成sha1sum?

node.js - NodeJS pbkdf2Sync 密码具有从 v0.12.7 到 v6.9.1 的可移植性

c++ - 理解 C++ 中的数值溢出

c# - 每当数据库中的数据更新时通知客户

c# - 检查 url 是否指向文件或页面

perl - 如何将 boolean 条件结果分配给 perl 中的标量变量?

ios - 解开分段字符串时发生 fatal error (swift3)

c# - MVC : How to get full file path from file input field?

c# - 首次 Twitter OAuth 请求后 session 丢失

java - Builder类中的director如何将一个null int设置为0?