根据埃里克博客的说法,
规则:GetHashCode 的使用者不能依赖它随着时间的推移或跨应用程序域的稳定。假设您有一个 Customer 对象,其中包含许多字段,例如名称、地址等。如果您在两个不同的进程中创建具有完全相同数据的两个此类对象,则它们不必返回相同的哈希码。如果您在星期二在一个进程中创建这样一个对象,将其关闭,然后在星期三再次运行该程序,则哈希码可能会有所不同。这在过去曾咬过人。System.String.GetHashCode 的文档特别指出,两个相同的字符串在不同版本的 CLR 中可以具有不同的哈希代码,事实上确实如此。不要将字符串哈希存储在数据库中并期望它们永远相同,因为它们不会。
我正在使用这个类,
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我将产品属性对象的哈希值保存在数据库中以进行更改跟踪。意味着哈希码会告诉我对象是否改变。如果可以在应用程序域之间更改哈希值,那么其他方法是什么?
我将产品属性对象的哈希值保存在数据库中以进行更改跟踪。
不要那样做。这几乎就是要求哈希码随着时间的推移保持稳定的定义。老实说,AppDomains 与此无关。
如果您需要某种稳定的哈希值,您可能需要将对象转换为稳定的二进制表示形式(例如使用BinaryWriter
),然后采用 SHA-256 哈希值 - 因为 SHA-256 (和类似的加密哈希值)是设计的保持稳定。
归档时间: |
|
查看次数: |
900 次 |
最近记录: |