Tôi đã đọc khá nhiều về chủ đề thú vị này (IMO). nhưng tôi không hoàn toàn hiểu được một điều:Từ điển <,> Kích thước, mã GetHashCode và số nguyên tố?
điển kích thước được tăng công suất của nó (đôi đến số nguyên tố gần) cho một số nguyên tố (khi tái phân bổ): vì:
int index = hashCode % [Dictionary Capacity];
- Vì vậy, chúng tôi có thể thấy rằng số nguyên tố được sử dụng tại đây cho
[Dictionary Capacity]
vì số GreatestCommonFactor của chúng tôi là1
. và điều này giúp để tránh va chạm.
Ngoài
Tôi đã nhìn thấy nhiều mẫu thực hiện GetHashCode()
:
Đây là một mẫu từ Jon Skeet:
public override int GetHashCode()
{
unchecked
{
int hash = 17;
// Suitable nullity checks etc, of course :)
hash = hash * 23 + field1.GetHashCode();
hash = hash * 23 + field2.GetHashCode();
hash = hash * 23 + field3.GetHashCode();
return hash;
}
}
Tôi không hiểu:
Questi trên
Có số nguyên tố được sử dụng cả trong:
Dictionary capacity
và trong thế hệ củagetHashCode
?
Bởi vì trong đoạn mã trên, có một cơ hội tốt mà giá trị trả về sẽ không là một số nguyên tố [hãy sửa lại cho tôi nếu tôi sai] vì
- nhân bằng cách
23
- bổ sung giá trị
GetHashCode()
cho mỗi trường.
Ví dụ: (11,17,173 là số nguyên tố)
int hash = 17;
hash = hash * 23 + 11; //402
hash = hash * 23 + 17; //9263
hash = hash * 23 + 173 //213222
return hash;
213222 không là số nguyên tố.
Cũng không có bất kỳ quy tắc toán học mà nhà nước:
(not a prime number) + (prime number) = (prime number)
cũng không
(not a prime number) * (prime number) = (prime number)
cũng không
(not a prime number) * (not a prime number) = (prime number)
Vì vậy, những gì tôi thiếu?
nơi bạn đã xem triển khai GetHashCode này? – Tigran
@Tigran http://stackoverflow.com/a/263416/859154 –
Tôi không bao giờ đọc bất cứ nơi nào mã băm phải là số nguyên tố, hoặc thậm chí tốt hơn nếu chúng là số nguyên tố - chúng nên được phân phối đồng đều nhất có thể trên toàn bộ phạm vi của họ. – MiMo