繁体   English   中英

GetHashCode()返回相同对象值的不同值

[英]GetHashCode() Returning Different Values For Identical Object Values

我试图使用GetHashCode()值来确定在通过ASP.NET MVC应用程序中的Ajax调用验证了对象之后是否更改了对象。 但是,我注意到这是行不通的,因为在验证期间返回的哈希码值将不同于在验证请求之后另一个请求中从模型绑定中使用相同值再次通过模型绑定创建对象时生成的哈希码。 我可以通过创建SHA哈希来解决此问题,但是我很好奇为什么看到这种行为。

我知道从GetHashCode()生成的哈希码不应该保留,并且在不同的平台上可能会有所不同。 我以为,当我第一次提出这个主意时,时间就足够短了,因为这两个调用之间的间隔是毫秒,调试时,我确认该模型包含了完全相同的值,但是仍然产生了不同的哈希码。

我很好奇为什么会表现出这种行为。 即使是Web应用程序,即使这是应用程序的单次运行,为什么还会发生这种情况? 这与ASP.NET生命周期有关吗?

如果需要,这里是我正在使用的类和GetHashCode实现:

class DispositionSubmission
{
    [Display(Name = "Client")]
    [Required(AllowEmptyStrings = false, ErrorMessage = "Client is required.")]
    public string ClientId { get; set; }
    public string Carrier { get; set; }
    public Dictionary<string, string> DispositionInfo { get; set; }
    public DispositionType Type { get; set; } //int based enum

...

    public override int GetHashCode()
    {
        unchecked
        {
            int hash = (int)15485863;
            int bigPrime = (int)15485867;

            hash = hash * bigPrime ^ ClientId.GetHashCode();
            hash = hash * bigPrime ^ (Carrier ?? "").GetHashCode();
            hash = hash * bigPrime ^ DispositionInfo.GetHashCode();
            hash = hash * bigPrime ^ Type.GetHashCode();

            return hash;
        }
    }
}

DispositionInfo没有重写GetHashCode()的类型。 其中具有相同对象的两个相同字典将具有不同的哈希码。

您将需要调整GetHashCode()使其不包括字典,或者使其变得更加复杂,以获取字典中每个键和值的哈希码并将它们加起来。

GetHashCode将为完全相同的对象返回相同的结果。 如果已重新分配对象,则在所有字段中都具有相同的值并不重要,您将获得不同的结果。 这是因为您真正使用的是Object.GetHashCode() ,但对其他字段一无所知。

此行为很重要,因为如果您使用哈希作为引用该对象的方式,则更改其任何值都将使其无法再次引用。

如果您希望具有相同字段的对象具有相同哈希码的行为,则需要自己实现。

编辑:澄清:字典DispositionInfo专门表现出此行为。 其他字段则不是,因为它们被设计为不可变的(字符串,整数等)。请考虑以其他方式获取哈希,或使用继承自Dictionary<string, string>的自定义类覆盖GetHashCode

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM