C# 使用C为唯一对象生成唯一哈希代码#

C# 使用C为唯一对象生成唯一哈希代码#,c#,C#,我想为一个对象生成哈希代码,并将生成的哈希代码存储到数据库中。一段时间后,我想更新对象。在更新对象之前,我想使用哈希代码检查对象是否已更改。如果生成的has代码和存储的has代码相同,我想跳过更新,否则我将更新对象。如何实现这一点?您可以使用xor包含所有相关属性的哈希代码 void Main() { var emp = new Employee { Id = 123, FirstName = "Billy", LastName = "Bo

我想为一个对象生成哈希代码,并将生成的哈希代码存储到数据库中。一段时间后,我想更新对象。在更新对象之前,我想使用哈希代码检查对象是否已更改。如果生成的has代码和存储的has代码相同,我想跳过更新,否则我将更新对象。如何实现这一点?

您可以使用xor包含所有相关属性的哈希代码

void Main() {
    var emp = new Employee {
        Id = 123,
        FirstName = "Billy",
        LastName = "Bobby", // lol, it's actually two first names
    };

    int originalHash = emp.GetHashCode();

    emp.FirstName = "Timmy";

    Console.WriteLine ("Original: {0}, Current: {1}", originalHash, emp.GetHashCode());
}

class Employee {
    public long Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public override int GetHashCode() {
        return this.Id.GetHashCode()
            ^ this.FirstName.GetHashCode()
            ^ this.LastName.GetHashCode();
    }

    public override bool Equals(object other) {
        var otherEmployee = other as Employee;
        return otherEmployee != null
            && otherEmployee.Id == this.Id
            && otherEmployee.FirstName == this.FirstName
            && otherEmployee.LastName == this.FirstName;
    }
}

请注意,这不是一个傻瓜式的解决方案。哈希代码不能明确地告诉您对象是否没有更改,因为它只能保存2^32个值,而数据超过4字节的对象可能具有更多可能的状态。您仍然需要检查所有字段值,以确保对象没有更改。请参阅已识别的副本,但也要小心将哈希代码与唯一性混为一谈,这两个概念不一样。@AnthonyPegram我不确定副本是否最适合OP。他正在将哈希值持久化到数据库中,您永远不应该保留内置.NET类“
.GetHashCode()
中的值。结果值不能保证在AppDomains中是相同的(这是来自
GetHashCode()
的结果的行为方式)。您链接到的重复问题在很大程度上依赖于对.net framework内置的类调用
.GetHashCode()
。@PavankumarKulkarni我不会在当前状态下重新打开您的问题,虽然我确实认为它不是链接问题的重复,但我也认为它太宽,因此应该关闭。如果你重新写你的问题来缩小它的焦点,并解释你自己实现这个问题的具体问题,我将重新打开你的问题。他正在将哈希代码持久化到数据库中
String.GetHashCode()
可以在程序运行期间为同一字符串返回不同的值,只有在单个AppDomain中的多个调用中才能得到相同的结果。如果目标是检测更改,则这是一个非常糟糕的实现。如果您切换名字和姓氏,哈希代码将完全相同,并且看起来对象没有更改。@DStanley:如果目标是检测更改,则所有实现都是错误的实现。只有2^32个可能的哈希代码。@recursive true,但这一个更糟糕,因为冲突的概率更高。