Is it required that I create my own hash function for custom types? Is there no defaults I can use with unordered_set?
Share
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
The standard library contains specialisations of
std::hash<T>for the fundamental types, for pointers and forstd::string(or rather, for all specializations ofstd::basic_string).Unfortunately the library does not contain the following vital new-from-old combination function, which is however part of Boost, and which you should copy into your code:
With this function, you can hash pairs, tuples, arrays, and any sort of range of elements that are themselves hashable. Browse the Boost sources for many examples and useful implementations. And obviously you can use this function to create a hash function for your own types. For example, here’s hashing a pair:
Please be aware, though, that hash-combining does not produce good hash values. The results have very poor statistic qualities (e.g. it is very easy to create hash collisions). Good hashing needs to be able to see all the raw input bits, and cannot be factored through partial hashes. (That’s why there isn’t a better solution in the current standard library; nobody has been able to come up with a satisfactory design.)