gpt4 book ai didi

c# - 如何创建实例的哈希值?

转载 作者:太空宇宙 更新时间:2023-11-03 19:06:59 25 4
gpt4 key购买 nike

我有一个产品类,

public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string ModelNumber { get; set; }
public string Sku { get; set; }
public string Description { get; set; }
public double Price { get; set; }
public double NewPrice { get; set; }
}

我将这个类保存在我的数据库表中。但我还需要将每个对象的哈希值保存在我的数据库表中以进行更改跟踪。我正在寻找的是,

        var p1 = new Product{
Id =2,
Name = "1",
ModelNumber = "4"
};
var p2 = new Product
{
Id = 2,
Name = "1",
ModelNumber = "4"
};
var hashOfp1 = Hash(p1);
var hashOfp2 = Hash(p2);
// This should return true because both objects have same values
if(hashOfp1 == hashOfp2){
}

最佳答案

这种事情的好处是:

public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string ModelNumber { get; set; }
public string Sku { get; set; }
public string Description { get; set; }
public double Price { get; set; }
public double NewPrice { get; set; }

public override int GetHashCode()
{
return Id ^ (Name ?? "").GetHashCode() ^ (ModelNumber ?? "").GetHashCode() ^ (Sku ?? "").GetHashCode()^ (Description ?? "").GetHashCode() ^ Price.GetHashCode() ^ NewPrice.GetHashCode();
}
}

想法是组合所有子属性的散列...您可以选择任何您想要的组合,但是“xor”运算符是一个很好的选择,因为它可以防止您的散列在您添加新属性时倾向于某些东西散列(就像“&”或“+”运算符)

编辑根据要求,对“倾向于某事”部分进行快速而粗略的解释:

假设您选择了 A & B & C & D ... 来散列值 A、B、C 等。您添加到哈希中的属性越多,您就越有可能拥有一个趋向于 int.MaxValue 的巨大哈希(对应于 11111111111111111111111111111111,二进制)

与“+”相同...您的哈希将变得越来越大,而不是使用完整范围的 int 值。

... 一个好的散列算法就是最大限度地为不同的值提供不同的散列的机会。要做到这一点,您可以研究如何值在现实生活中的使用(可能会很痛苦并且矫枉过正),或者最大化您的散列算法涵盖随机未知值的 int 值范围。

关于c# - 如何创建实例的哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25639361/

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