对不起,将两个问题组合为一个,它们是相关的。HashCode
表示HashSet
等。据我了解,它们必须是唯一的,不能更改,并且将对象的任何配置表示为单个数字。
我的第一个问题是,对于包含两个Int16s a
和b
的对象,我的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
。是。诸如
Dictionary
和HashSet
之类的类型必须能够使用固定大小,以便它们可以与其一起使用以将值放入存储桶中。例如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/