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