Tại sao '397' được sử dụng cho ghi đè ReSharper GetHashCode?


150

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 mà nó tạo ra cho GetHashCode () trông giống như:

    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 riêng mình trong đó, nhưng điều tôi muốn biết là tại sao 397?

  • EDIT: Vì vậy, câu hỏi của tôi sẽ được diễn đạt tốt hơn vì, 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?

Câu trả lời:


165

Có lẽ bởi vì 397 là một số nguyên tố có kích thước đủ để làm cho biến kết quả tràn và trộn các bit của hàm băm một chút, cung cấp phân phối mã băm tốt hơn. Không có gì đặc biệt về 397 phân biệt nó với các số nguyên tố khác có cùng độ lớn.


73
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 sao?
Russell B

2
Được rồi, nhưng tại sao nó phải là số nguyên tố, và tại sao nó phải có độ lớn chính xác như vậy? 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 (và lý do duy nhất cho phép nhân này là đột biến) chúng ta không cần số là số nguyên tố. Chúng ta cần hệ số 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 chắn về độ lớn.
Andriy K

5
Như Nick đã nói, không có gì đặc biệt về nó. Không cần phải có kích thước đó, đó chỉ là một con số đủ lớn để khi bạn tính toán một hàm băm, kết quả sẽ tràn ra (vì GetHashCode () trả về một Int32). Chọn một số nguyên tố chỉ hữu ích cho phân phối, tôi không có bằng cấp toán học nên tôi sẽ không thử giải thích nó, nhưng nhân với một số nguyên tố sẽ có kết quả phân phối tốt hơn nhân với bất kỳ số tùy ý nào khác.
Ben Randall

16

Hàm băm mà chia sẻ lại sử dụng trông giống như một biến thể của hàm băm FNV . FNV thường được thực hiện với các số nguyên tố khác nhau. Có một cuộc thảo luận về sự lựa chọn số nguyên tố thích hợp cho FNV ở đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.