理解 ValueType 哈希代码实现
在提供的代码中,两个结构体 k1 和 k2 在 Name 字段中具有不同的字符串值,但令人惊讶的是,它们返回相同的值哈希码。这是因为值类型的 GetHashCode 实现非常复杂。
CLR 对值类型的处理
对于没有引用字段或对齐间隙的值类型,CLR 使用通过对结构中的所有位进行异或运算来实现快速哈希机制。但是,当存在引用字段或间隙时,CLR 会采用更具选择性的方法。
选择性字段哈希
CLR 不会考虑所有字段,而是会迭代结构体的字段并标识第一个可用字段(非空值类型或对象引用)。然后使用该单个字段和方法表指针计算哈希码,该过程结束。
字段选择
这解释了为什么只有 id 字段有助于提供的示例中的哈希代码,即使名称字段不同。因此,交换 id 和 Name 字段的顺序可确保 Name 字段用于哈希。
十进制怪异
值得注意的是,CLR 的快速哈希存在一个错误包含 Decimal 值的结构的计算。 Decimal 的位不能精确反映其数值,导致在某些情况下生成不正确的哈希码。
以上是为什么这些值类型尽管字符串字段不同但具有相同的哈希码?的详细内容。更多信息请关注PHP中文网其他相关文章!