C에서 해시 값을 결합하는 가장 좋은 방법: Demystifying Boost::hash_combine
C 세계에서는 Boost::hash_combine이 자주 사용됩니다. 해시 값을 결합하는 최적의 방법으로 알려져 있습니다. 질문이 생깁니다: 이것이 왜 최선의 접근 방식입니까?
boost::hash_combine 이해
boost::hash_combine 함수는 두 가지 인수, 즉 시드 값과 해시할 값입니다. 그런 다음 일련의 비트 조작을 사용하여 값을 결합하여 이전 해시의 엔트로피를 통합하는 새로운 시드를 생성합니다.
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); }
왜 최고가 아닌가?
놀랍게도 Boost::hash_combine은 기대만큼 최적이 아닙니다. see.
더 나은 대안
대체 해시 조합 기능은 우수한 분산과 엔트로피 보존을 모두 제공할 수 있습니다.
template <class T> inline size_t hash_combine(std::size_t& seed, const T& v) { return rotl(seed, std::numeric_limits<size_t>::digits/3) ^ distribute(std::hash<T>{}(v)); }
이 기능은 활용:
성능 고려 사항
boost::hash_combine은 빠르지만 대체 기능은 희생됩니다. 향상된 해시 품질을 위한 약간의 속도. 그러나 이러한 속도 균형은 일반적으로 대부분의 애플리케이션에서 무시할 수 있습니다.
위 내용은 Boost::hash_combine이 C에서 해시 값을 결합하는 가장 좋은 방법이 아닌 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!