2011-08-10 28 views
12

tôi đang tìm kiếm thông qua một số các nguồn .net hôm qua và thấy một số hiện thực của GetHashCode với một cái gì đó dọc theo dòng này:Net GetHashCode Bit Chuyển Operation

(i1 << 5) + i^i2 

Tôi hiểu những gì đang làm và tại sao . Điều tôi muốn biết là lý do tại sao họ sử dụng (i1 < < 5) + i thay vì (i1 < < 5) - i.

Hầu hết các khung tôi đã sử dụng -i vì nó tương đương với phép nhân với 31 là số nguyên tố, nhưng cách của Microsoft tương đương với số 33 với 11 và 3 là các thừa số và do đó không phải là số nguyên tố.

Có biện minh cho điều này không? Bất kỳ giả thuyết hợp lý nào?

+1

Được rồi, tôi đã tìm ra lý do tại sao Microsoft sử dụng 33. Đó được gọi là Bernstein Hash. Nó chỉ ra rằng 33 có một số tính chất kỳ diệu mà sản xuất một phân phối tốt của mã băm và có rất ít kiến ​​thức lý thuyết là tại sao. –

Trả lời

3

Tôi đã hỏi cùng một câu hỏi trên math.stackexchange.com: Curious Properties of 33.

Các phỏng đoán giữa các nhà toán học và nghiên cứu tôi đã làm về chủ đề này dẫn tôi để tin rằng câu trả lời là thế này:

Được rồi, tôi phát hiện ra lý do tại sao Microsoft sử dụng 33. Đó gọi là Bernstein Hash. Nó chỉ ra rằng 33 có một số tính chất kỳ diệu mà sản xuất một phân phối tốt các mã băm và có rất ít lý thuyết kiến ​​thức về lý do tại sao.

Về cơ bản, trong entropy và so sánh tốc độ, Bernstein hoạt động tốt và khá linh hoạt. Dan Bernstein, người đã đưa ra hằng số 33, đã không thể giải thích tài sản nào của 33 đã tạo ra sự phân phối tốt như vậy.

Một số giấy tờ đã được viết so sánh hàm băm và đã chứng thực phát hiện này mà không giải thích thêm về lợi ích của việc sử dụng 33. Hơn nữa, tôi không thể tìm thấy lý do tại sao Java sử dụng 31 thay thế. Nó dường như là một bí ẩn toán học và lập trình cho đến nay.

0

Tôi không nhớ nếu 31 là một trong những số nguyên tố đó, nhưng có một số số nguyên tố được sử dụng làm dung lượng bởi Dictionary<K,V>. Và nếu bạn sử dụng trường bên trái không ảnh hưởng đến nhóm đã chọn nữa và hàm băm bị thoái hóa.

+0

31 không xuất hiện trong danh sách số nguyên tố cho số lượng nhóm (xem System.Collections.HashHelpers.primes), nhưng đó không phải là câu hỏi của tôi ngay từ đầu. Câu hỏi của tôi là, tại sao Microsoft nhân với 33 thay vì 31? Các khung công tác khác mà tôi đã thấy nhân với 31. 33 thậm chí không phải là số nguyên tố. –

+0

Nếu 31 xuất hiện trong danh sách đó thì điều đó sẽ giải thích tại sao MS không sử dụng 31 làm phép nhân. Nhưng là thủ tướng không phải là tất cả những điều quan trọng. – CodesInChaos

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