gpt4 book ai didi

c# - 在 C# 中实现 GetHashCode。空值处理

转载 作者:太空狗 更新时间:2023-10-30 00:40:05 24 4
gpt4 key购买 nike

在我开始之前,我在 Mono 环境中测试了这里的所有代码示例,并且在 GetHashCode 实现中有一个明显的区别:

string.Empty.GetHashCode(); // returns 0 in Mono 3.10
string.Empty.GetHashCode(); // returns 757602046 in .NET 4.5.1

我的实现是基于这个 SO Answer @JonSkeet 在评论中还建议对 NULL 值使用 0 哈希码(不确定我应该如何对它们进行哈希处理)。

I usually use 0 as the effective hash code for null - which isn't the same as ignoring the field.

所以有了以下implementation (单声道 3.10):

public class Entity {
public int EntityID { get; set; }
public string EntityName { get; set; }

public override int GetHashCode() {
unchecked {
int hash = 15485863; // prime number
int multiplier = 1299709; // another prime number

hash = hash * multiplier + EntityID.GetHashCode();
hash = hash * multiplier + (EntityName != null ? EntityName.GetHashCode() : 0);

return hash;
}
}
}

很容易发现碰撞,例如

var hash1 = new Entity { EntityID = 1337, EntityName = "" }.GetHashCode();
var hash2 = new Entity { EntityID = 1337, EntityName = null }.GetHashCode();

bool equals = hash1 == hash2; // true

我可以用其他数字替换空值 0,但是它不会解决问题,因为某些哈希(字符串)输出仍然有可能生成这样的数字,我会遇到另一次冲突。

我的问题:在使用上述示例中的算法时,我应该如何处理空值?

最佳答案

这里的“问题”是您正在尝试获取无冲突哈希码。虽然这对于使用散列码进行查找(例如 HashSetDictionary )的集合实现的查找性能来说是完美的,但在大多数情况下这是行不通的。

原因是哈希码只是一个 32 位整数值,它代表的数据通常要大得多(多个整数值、字符串等)。

所以哈希码只是用来定义两个对象可以相等。集合类使用散列码来细化存储对象的区域,并使用 equals 函数来查找两个对象是否真的相同。因此,您应该始终实现 Equals您为其实现哈希码的类的函数。虽然这些类将退回到对象的 equals 函数,但实现 IEquatable<T> 也是一个好主意吗?接口(interface)以避免任何类型的输入问题(仍然覆盖 Object 的默认 equals 方法!)

关于c# - 在 C# 中实现 GetHashCode。空值处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31206991/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com