>  기사  >  백엔드 개발  >  Boost::hash_combine이 C에서 해시 값을 결합하는 가장 좋은 방법이 아닌 이유는 무엇입니까?

Boost::hash_combine이 C에서 해시 값을 결합하는 가장 좋은 방법이 아닌 이유는 무엇입니까?

DDD
DDD원래의
2024-11-10 15:50:03776검색

Why is boost::hash_combine Not the Best Way to Combine Hash Values in C  ?

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.

  1. 배포 불량: std::hash와 같이 분산이 불량한 해시 함수와 함께 사용하면 Boost::hash_combine은 높은 충돌 비율을 나타낼 수 있습니다.
  2. 엔트로피 손실: 모든 엔트로피가 씨앗에 집중되면 일부 계산 시 엔트로피가 손실될 수 있습니다.

더 나은 대안

대체 해시 조합 기능은 우수한 분산과 엔트로피 보존을 모두 제공할 수 있습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.