Giống như nhiều bạn, tôi sử dụng ReSharper để tăng tốc quá trình phát triển. Khi bạn sử dụng nó để ghi đè các thành viên bình đẳng của một lớp, mã-gen nó tạo cho GetHashCode() trông giống như:Tại sao '397' được sử dụng để ghi đè ReHarper GetHashCode?
public override int GetHashCode()
{
unchecked
{
int result = (Key != null ? Key.GetHashCode() : 0);
result = (result * 397)^(EditableProperty != null ? EditableProperty.GetHashCode() : 0);
result = (result * 397)^ObjectId;
return result;
}
}
Tất nhiên tôi có một số thành viên của mình trong đó, nhưng những gì tôi đang muốn biết tại sao 397?
- EDIT: Vì vậy, câu hỏi của tôi sẽ tốt hơn được gọi là, có điều gì đó 'đặc biệt' về số nguyên tố 397 bên ngoài nó là số nguyên tố không?
Và 397 là hạnh phúc. Không phải tất cả chúng ta chỉ muốn được hạnh phúc? –
Được rồi, nhưng tại sao nó phải là nguyên tố, và tại sao nó phải có độ chính xác đó? Nếu nó phải là số nguyên tố, tại sao không phải là 2 hoặc 2147483647? Tôi đoán để có được đột biến tốt đẹp (và chỉ có lý do cho phép nhân này là đột biến) chúng ta không cần số phải là số nguyên tố. Chúng ta cần phép nhân để có số hoặc số 0 và số tương đối giống nhau, tốt nhất là không có các mẫu rõ ràng. 397 = 110001101b tuân thủ. Vẫn không chắc về độ lớn. –
Như Nick đã nói, không có gì đặc biệt đặc biệt về nó. Nó không cần phải là kích thước đó, đó chỉ là một con số đủ lớn để khi bạn tính toán băm, kết quả sẽ tràn (vì GetHashCode() trả về một Int32). Việc chọn một số nguyên tố chỉ hữu ích cho việc phân phối, tôi không có bằng toán nên tôi sẽ không cố gắng giải thích nó, nhưng phép nhân với số nguyên tố sẽ có kết quả phân phối tốt hơn phép nhân với bất kỳ số tùy ý nào khác. –