Câu hỏi này không phải là lý do tại sao một số nhân, đó là khá rõ ràng - về phân phối của nó.Tính toán Hashcode tại sao nhân và bỏ qua các bit tràn?
Why use a prime number in hashCode?
Nhưng thay vì đây là chi tiết về một tài sản của nhân mà trở nên quan trọng hơn các yếu tố khác có trong một công thức tính toán hashcode.
Một phép tính đơn giản rõ ràng có thể tràn nhưng không quan trọng lắm.
a * 31 + b
Vấn đề thực sự được thể hiện khi có nhiều mục trong công thức.
((a * 31) + b) * 31 ... 6n.
Khi hơn 5 hoặc 6 cụm từ được bao gồm giá trị của cụm từ đầu tiên bị mất do bit của nó bị tràn bởi thời gian giá trị băm lên đến bao gồm từ 5+. Sử dụng hệ thống này chỉ có 5 thuật ngữ cuối cùng là những người đóng góp đáng kể cho giá trị cuối cùng.
31^7 > Integer.MAX_VALUE
Vậy tại sao hầu hết các tính toán không thể cuộn các bit tràn ngược lại và xor w/các bit thấp hơn của kết quả. Tôi đánh giá cao điều này đòi hỏi một số fiddling bit và tính toán phải được thực hiện bằng cách sử dụng longs (64 bit) để 32 bit đầu có thể được XOR'd với kết quả số nguyên nhưng ít nhất không có bit sẽ bị mất.
Có bất kỳ lý do cụ thể nào khiến tràn qua bị bỏ qua không? Nó không phải là tốn kém để sử dụng một thời gian dài như mô tả trước đây.
EDIT
100000*31^7= 2751261411100000 0x9C641F717C560
6553600000*31^7 180306667837849600000 0xC641F717C5600000
Lưu ý rằng giá trị thứ hai là lớn hơn so với trước đó một cách chính xác 65.536 lần đó cũng có nghĩa là câu trả lời của nó là 16 bit lớn hơn. Lưu ý rằng giá trị số nguyên của 0xC641F717C5600000 là 0xC5600000 giá trị quan trọng thực tế bị mất từ giá trị 16 bit.
*SAMPLE A*
65536*4096*27512614111
=7385361114638319616
=0x667E12CDF0000000
12345678
=0xF0000000
*SAMPLE B*
9*65536*4096*27512614111
=66468250031744876544
=0x9A6EA93D70000000
12345678
=0x70000000
Chú ý rằng các bit nhất đầu MẪU B đó là chính xác 9x MẪU Một làm cho gần như tuyệt đối không có sự khác biệt về giá trị 32 bit cuối cùng - nếu tôi thay đổi 9x đến 17 lần sau đó các bit thấp sẽ giống hệt nhau. Tuy nhiên, nếu các bit trên cùng không bị "mất" do tràn và xord với 32 bit thấp hơn thì giá trị sẽ khác nhau.
Không chỉ vậy, nhưng một thời gian dài sẽ chạy vào cùng một vấn đề, chỉ cần mất một chút 'long'er. (xin lỗi, đó là một điều xấu ...) – corsiKa
Toàn bộ lý do cho số nguyên tố là yếu tố nhân là vì tỷ lệ cược có nghĩa là các giá trị được dịch chuyển sang trái và cuối cùng tất cả các bit bị mất. Tuy nhiên, các số nguyên tố vẫn có cùng một prob, nhưng chúng nhanh hơn một chút và mất nhiều thời gian hơn để các bit biến mất. –