2008-09-19 25 views
124

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?

Trả lời

134

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

+59

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? –

+2

Đượ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. –

+4

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. –

15

Ben đúng, phản ánh Hội đồng bạn có thể thấy đó chỉ là số nguyên tố mà họ đã chọn sử dụng.

+8

Hội đồng nào? –

+9

asm: 'JetBrains.ReSharper.Feature.Services.CSharp' phương pháp:' CSharpEqualityHelper.GenerateGetHashCodeBody' –

6

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

Các vấn đề liên quan