簡體   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