1. 程式人生 > >C#本質論6.0第九章:良構類型

C#本質論6.0第九章:良構類型

散列 成功 生存 頻繁 一點 進行 equals() object 性能

重寫object的成員:

重寫HashCode():

散列碼HashCode的作用是生成與對象值對應的數字,從而高效地平衡散列表。要獲得良好的GetHashCode()實現,應按照以下實現原則:

  • 必須:
    • 相等的對象必然有相等的散列碼。
    • 在特定對象的生存期內,GetHashCode()始終返回相同的值,即使對象的數據發生了改變。許多時候應緩存方法的返回值,從而確保這一點。
    • GetHashCode()不應引發任何異常,GetHashCode()總是成功返回一個值。
  • 性能:
    • GetHashCode()的性能應該優化,GetHashCode()通常在Equals()實現中用於“短路”一次完整的相等性比較,所以,當類型作為字典集合中的鍵類型使用時,會頻繁的調用這個方法。
    • 可能的散列碼值應當在int的範圍內平均分布。
    • 兩個對象的細微差異應造成散列碼值的極大差異。理想情況下,一位的差異應造成散列碼平均16位的差異。這有助於確保不管散列表如何對散列值進行“裝桶”,也能保持良好的平衡性。
  • 安全:攻擊者應該難以偽造具有特定散列碼的對象。攻擊的手法是向散列表中填寫大量散列成同一個值的數據,如果散列表的實現不高效,就易於受到Dos攻擊。

C#本質論6.0第九章:良構類型