不同AppDomain之间的对象的GetHashCode方法会返回不同的结果吗?

use*_*567 0 c# hash

根据埃里克博客的说法,

规则: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)

我将产品属性对象的哈希值保存在数据库中以进行更改跟踪。意味着哈希码会告诉我对象是否改变。如果可以在应用程序域之间更改哈希值,那么其他方法是什么?

Jon*_*eet 5

我将产品属性对象的哈希值保存在数据库中以进行更改跟踪。

不要那样做。这几乎就是要求哈希码随着时间的推移保持稳定的定义。老实说,AppDomains 与此无关。

如果您需要某种稳定的哈希值您可能需要将对象转换为稳定的二进制表示形式(例如使用BinaryWriter),然后采用 SHA-256 哈希值 - 因为 SHA-256 (和类似的加密哈希值)设计的保持稳定。

  • @user960567:嗯,我建议使用 `BinaryWriter` 来有效地将您的 `Product` 对象序列化为字节数组 - 然后您可以使用 `SHA256` 来获取该数据的稳定哈希值。其中哪一部分被证明是一个问题?(可以在控制台应用程序中完成所有这些操作。) (2认同)