在C#中实现GetHashCode.空值处理
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在C#中实现GetHashCode.空值处理,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1749字,纯文字阅读大概需要3分钟。
内容图文
![在C#中实现GetHashCode.空值处理](/upload/InfoBanner/zyjiaocheng/805/d63b6b709f7d4e90bda87fc8c6d50ed7.jpg)
在开始之前,我在Mono环境中测试了所有代码示例,并且GetHashCode实现中有一个明显的区别:
string.Empty.GetHashCode(); // returns 0 in Mono 3.10
string.Empty.GetHashCode(); // returns 757602046 in .NET 4.5.1
我通过@JonSkeet基于这个SO Answer实现了我的实现,并且在评论中他还建议使用0哈希值来表示NULL值(不知道我应该如何哈希它们).
I usually use 0 as the effective hash code for null – which isn’t the same as ignoring the field.
所以遵循implementation(Mono 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
我可以用其他一些数字替换null-value 0,但是它不会解决问题,因为仍然有一些哈希(字符串)输出会生成这样的数字,我会得到另一个碰撞.
我的问题:在使用上面的示例算法时,我应该如何处理空值?
解决方法:
这里的“问题”是你正在尝试获取无冲突的哈希码.虽然这对于在大多数情况下使用哈希代码进行查找(例如HashSet和Dictionary)的集合实现的查找性能来说是完美的,但这不起作用.
原因是哈希码只是一个32位整数值,它表示通常更大的数据(多个整数值,字符串等).
所以哈希码只是定义两个对象可以相等.集合类使用哈希代码来优化存储对象的区域,并使用equals函数来查找两个对象是否真的相同.因此,您应该始终为实现哈希代码的类实现Equals函数.虽然这些类将回归到对象的equals函数,但实现IEquatable< T>也是一个好主意.避免输入任何类型的问题的接口(仍然覆盖Object的默认equals方法!)
内容总结
以上是互联网集市为您收集整理的在C#中实现GetHashCode.空值处理全部内容,希望文章能够帮你解决在C#中实现GetHashCode.空值处理所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。