2015-04-26 12 views
8

Khi sử dụng thư viện tăng, các fuction boost::hash_combine công trình như thế này:boost :: hash_combine vs đơn giản XOR'ing

seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); 

http://www.boost.org/doc/libs/1_46_1/doc/html/hash/reference.html#boost.hash_combine

lợi thế của phương pháp này so với chỉ đơn giản là XOR-ing là gì?

Với XOR-ing, người ta thậm chí có thể sử dụng hàm băm để sử dụng các vùng chứa không có thứ tự làm khóa, trong khi điều này phụ thuộc vào thứ tự.

+9

Có {1,2} băm khác với {2,1} thường được coi là một điều tốt ... –

+1

Vui lòng xem http://stackoverflow.com/questions/8513911/how-to-create-a-good -hash-kết hợp-với-64-bit-đầu ra-cảm hứng-by-boosthash-co; lãnh thổ này bị đánh đến chết – sehe

Trả lời

3

Có nhiều vùng chứa có thứ tự như danh sách. Nếu bạn sử dụng XOR thì về cơ bản bạn sẽ nói rằng [0, 1] giống với [1, 0]. Đó rõ ràng không phải là trường hợp. Nó dễ dàng hơn nhiều để ghi đè lên phương pháp cho các container không có thứ tự hơn là áp đặt một phương thức sẽ tạo ra nhiều va chạm cho các thứ tự được sắp xếp. XOR có rất nhiều đặc tính khó chịu khác. Ví dụ, nếu bạn có các phần tử trùng lặp thì chúng sẽ hủy lẫn nhau.

Cuối cùng, ý tưởng cho một băm là hợp lý chắc chắn rằng bạn không nhận được cùng một giá trị cho nhiều yếu tố. XOR không phù hợp với tài sản đó.

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