Tôi có cần tạo hàm băm của riêng mình cho các loại tùy chỉnh không? Không có mặc định tôi có thể sử dụng với unordered_set?Cách sử dụng unordered_set với các loại tùy chỉnh?
Trả lời
Thư viện chuẩn chứa các chuyên ngành của std::hash<T>
cho các loại cơ bản, cho con trỏ và cho std::string
(hoặc đúng hơn, cho tất cả các chuyên ngành của std::basic_string
).
Đáng tiếc là thư viện không không chứa quan trọng chức năng mới như sau-từ-cũ kết hợp, tuy nhiên đó là một phần của Boost, và trong đó bạn nên sao chép vào mã của bạn:
template <class T>
inline void hash_combine(std::size_t & seed, const T & v)
{
std::hash<T> hasher;
seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
Với chức năng này, bạn có thể băm cặp, bộ dữ liệu, mảng và bất kỳ loại nào của phạm vi của các phần tử mà chính chúng có thể băm. Duyệt các nguồn Boost cho nhiều ví dụ và triển khai hữu ích. Và rõ ràng là bạn có thể sử dụng hàm này để tạo hàm băm cho các kiểu của riêng bạn. Ví dụ: đây là băm một cặp:
template<typename S, typename T> struct pair_hash<std::pair<S, T>>
{
inline std::size_t operator()(const std::pair<S, T> & v) const
{
std::size_t seed = 0;
hash_combine(seed, v.first);
hash_combine(seed, v.second);
return seed;
}
};
Xin lưu ý, mặc dù kết hợp băm không tạo ra giá trị băm tốt. Kết quả có chất lượng thống kê rất kém (ví dụ: rất dễ dàng để tạo ra các va chạm băm). Cần băm tốt để có thể xem tất cả các bit đầu vào thô, và không thể được thừa nhận thông qua các phần băm. (Đó là lý do tại sao không có giải pháp tốt hơn trong thư viện chuẩn hiện tại; không ai có thể đưa ra một thiết kế thỏa đáng.)
Giải thích cho dòng khóa của hàm hash_combine là gì: seed^= hasher (v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); –
Nevermind, tìm thấy câu trả lời ở đây (http://stackoverflow.com/questions/4948780/magic-number-in-boosthash-combine). –
Có, bạn sẽ cần phải viết hàm băm của riêng bạn. Đây không phải là xấu như nó âm thanh: nếu lớp học của bạn có bất kỳ thành viên băm mà bạn biết sẽ được hợp lý duy nhất, bạn chỉ có thể trả về băm của thành viên đó.
Bạn có thể cung cấp băm này theo chuyên std::hash
hoặc bằng cách chuyển lớp băm một cách rõ ràng làm thông số mẫu.
- 1. Làm cách nào để sử dụng unordered_set?
- 2. JavaScriptSerializer với loại tùy chỉnh
- 3. Cách sử dụng loại tùy chỉnh trong cột JPA?
- 4. Sử dụng FileFilter tùy chỉnh với JFileChooser
- 5. Sử dụng OpenSSL với kênh tùy chỉnh
- 6. Cách sử dụng liên kết tùy chỉnh với ko.observableArray()
- 7. Sử dụng Html.BeginForm() với các tuyến đường tùy chỉnh
- 8. NSCoder và các loại tùy chỉnh
- 9. Cách sử dụng điểm đánh dấu tùy chỉnh với ô?
- 10. Sử dụng HashMap với khóa tùy chỉnh
- 11. Sử dụng gốc tùy chỉnh với FiddlerCore
- 12. Phân loại GridView với các trường mẫu tùy chỉnh
- 13. cách hiển thị dữ liệu tùy chỉnh từ các loại bài đăng tùy chỉnh
- 14. Robomongo, cách sử dụng các chức năng tùy chỉnh?
- 15. Các loại dữ liệu tùy chỉnh SQLITE?
- 16. Sử dụng trình phân bổ tùy chỉnh với tăng :: bimap
- 17. Các loại và loại bài đăng tùy chỉnh
- 18. Ruby on Rails + PostgreSQL: sử dụng các chuỗi tùy chỉnh
- 19. Sử dụng tùy chỉnh simpleCursorAdapter
- 20. Sử dụng cú pháp trình khởi tạo bộ sưu tập trên các loại tùy chỉnh?
- 21. Cách sử dụng trình quản lý tùy chỉnh với các đối tượng liên quan?
- 22. Làm cách nào để sử dụng java cho mỗi vòng lặp với các lớp tùy chỉnh?
- 23. iPhone- cách sử dụng Storyboard với các ô UITableView tùy chỉnh và CellWithIdentifier
- 24. Cách sử dụng Play với các mô-đun tùy chỉnh và tích hợp liên tục
- 25. Cách sử dụng các trình đổ bóng tùy chỉnh cùng với GLKit
- 26. Sử dụng một std :: unordered_set của std :: unique_ptr
- 27. Sử dụng các kiểu dữ liệu tùy chỉnh trong VBA
- 28. cách tạo loại tùy chọn tùy chỉnh mới trong Magento?
- 29. Sử dụng deleter tùy chỉnh với std :: shared_ptr
- 30. Thêm tiêu đề tùy chỉnh bằng cách sử dụng HttpWebRequest
"Cách mặc định" để băm một 'Foo' là gì? –