簡體   English   中英

如何使用HashCode.Combine避免沖突?

[英]How to avoid collisions using HashCode.Combine?

我在建立具有相當小的數據集(約10萬行)的哈希表時遇到了沖突。 我在這里做錯什么了嗎?

這是一個2位數據的示例,通常會產生相同的哈希值。 (偶爾運行會產生不同的哈希值):

long long1 = 330765;
long long2 = 227691;
DateTime date1= new DateTime(2016, 5, 24);
DateTime date2= new DateTime(2016, 1, 25);

var c1 = HashCode.Combine(long1, date1);
var c2 = HashCode.Combine(long2, date2);
Console.WriteLine(c1);
Console.WriteLine(c2);

與dotnetcore 2.1兼容

永遠無法完全避免與哈希碼發生沖突(除非類型的可能的獨特值少於2 ^ 32,例如短​​褲或字節之類的東西)。 編寫良好的哈希只是意味着盡可能地減少沖突。 您可以通過盡最大努力確保哈希碼在(整個) int范圍內(大約)均勻分布來做到這一點。

您還可以嘗試避免某些通常共同使用的值發生沖突(例如,您可以針對日期創建一種生成算法,以使同一周中的日期不會發生沖突,並確保所有碰撞發生的日期都比該日期更遠) 。

但是,無論何時使用生成的哈希碼,都需要某種機制來處理沖突。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM