Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Reference(參考)

Header <boost/functional/hash.hpp>

完整的規範請參見 C++ Standard Library Technical Report section 6.3 和 Library Extension Technical Report Issues List issue 6.18 (page 63)。

定義 boost::hash,以及輔助函數。

namespace boost {
  template<typename T> struct hash;

  template<> struct hash<bool>;
  template<> struct hash<char>;
  template<> struct hash<signed char>;
  template<> struct hash<unsigned char>;
  template<> struct hash<wchar_t>;
  template<> struct hash<short>;
  template<> struct hash<unsigned short>;
  template<> struct hash<int>;
  template<> struct hash<unsigned int>;
  template<> struct hash<long>;
  template<> struct hash<unsigned long>;
  template<> struct hash<long long>;
  template<> struct hash<unsigned long long>;
  template<> struct hash<float>;
  template<> struct hash<double>;
  template<> struct hash<long double>;
  template<> struct hash<std::string>;
  template<> struct hash<std::wstring>;
  template<typename T> struct hash<T*>;

  // Support functions (Boost extension).
  template<typename T> void hash_combine(size_t &, T const&);
  template<typename It> std::size_t hash_range(It, It);
  template<typename It> void hash_range(std::size_t&, It, It);

  // Overloadable hash implementation (Boost extension).
  std::size_t hash_value(bool);
  std::size_t hash_value(char);
  std::size_t hash_value(signed char);
  std::size_t hash_value(unsigned char);
  std::size_t hash_value(wchar_t);
  std::size_t hash_value(short);
  std::size_t hash_value(unsigned short);
  std::size_t hash_value(int);
  std::size_t hash_value(unsigned int);
  std::size_t hash_value(long);
  std::size_t hash_value(unsigned long);
  std::size_t hash_value(long long);
  std::size_t hash_value(unsigned long long);
  std::size_t hash_value(float);
  std::size_t hash_value(double);
  std::size_t hash_value(long double);
  template<typename T> std::size_t hash_value(T* const&);
  template<typename T, unsigned N> std::size_t hash_value(T (&val)[N]);
  template<typename T, unsigned N> std::size_t hash_value(const T (&val)[N]);
  template<typename Ch, typename A> 
    std::size_t hash_value(std::basic_string<Ch, std::char_traits<Ch>, A> const&);
  template<typename A, typename B> 
    std::size_t hash_value(std::pair<A, B> const&);
  template<typename T, typename A> 
    std::size_t hash_value(std::vector<T, A> const&);
  template<typename T, typename A> 
    std::size_t hash_value(std::list<T, A> const&);
  template<typename T, typename A> 
    std::size_t hash_value(std::deque<T, A> const&);
  template<typename K, typename C, typename A> 
    std::size_t hash_value(std::set<K, C, A> const&);
  template<typename K, typename C, typename A> 
    std::size_t hash_value(std::multiset<K, C, A> const&);
  template<typename K, typename T, typename C, typename A> 
    std::size_t hash_value(std::map<K, T, C, A> const&);
  template<typename K, typename T, typename C, typename A> 
    std::size_t hash_value(std::multimap<K, T, C, A> const&);
  template<typename T> std::size_t hash_value(std::complex<T> const&);
}

支持函數(Boost 擴展)

  1. template<typename T> void hash_combine(size_t & seed, T const& v);

    效果:

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

    注意:

    hash_value 被調用是不帶限定的,以便可以通過 ADL 找到重載。

    這是一個對 TR1 的擴展

    拋出:

    只有 hash_value(T) 拋出時,才會拋出。只要 hash_value(T) 具有強異常安全,它就具有強異常安全。
  2. template<typename It> std::size_t hash_range(It first, It last);
    template<typename It> void hash_range(std::size_t& seed, It first, It last);

    效果:

    對於雙參數重載版本:

    size_t seed = 0;
    
    for(; first != last; ++first)
    {
        hash_combine(seed, *first);
    }
    
    return seed;
    

    對於三參數重載版本:

    for(; first != last; ++first)
    {
        hash_combine(seed, *first);
    }
    

    注意:

    hash_range 是受元素的順序影響的,所以將它用於無序容器是不合適的。

    這是一個對 TR1 的擴展

    拋出:

    只有 hash_value(std::iterator_traits<It>::value_type) 拋出時,才會拋出。只要 hash_value(std::iterator_traits<It>::value_type) 具有基本異常安全,hash_range(std::size_t&, It, It) 就具有基本異常安全。

可重載的散列實現(Boost 擴展)

  1. std::size_t hash_value(bool val);
    std::size_t hash_value(char val);
    std::size_t hash_value(signed char val);
    std::size_t hash_value(unsigned char val);
    std::size_t hash_value(wchar_t val);
    std::size_t hash_value(short val);
    std::size_t hash_value(unsigned short val);
    std::size_t hash_value(int val);
    std::size_t hash_value(unsigned int val);
    std::size_t hash_value(long val);
    std::size_t hash_value(unsigned long val);
    std::size_t hash_value(long long val);
    std::size_t hash_value(unsigned long long val);
    std::size_t hash_value(float val);
    std::size_t hash_value(double val);
    std::size_t hash_value(long double val);
    template<typename T> std::size_t hash_value(T* const& val);
    template<typename T, unsigned N> std::size_t hash_value(T (&val)[N]);
    template<typename T, unsigned N> std::size_t hash_value(const T (&val)[N]);
    template<typename Ch, typename A> 
      std::size_t hash_value(std::basic_string<Ch, std::char_traits<Ch>, A> const& val);
    template<typename A, typename B> 
      std::size_t hash_value(std::pair<A, B> const& val);
    template<typename T, typename A> 
      std::size_t hash_value(std::vector<T, A> const& val);
    template<typename T, typename A> 
      std::size_t hash_value(std::list<T, A> const& val);
    template<typename T, typename A> 
      std::size_t hash_value(std::deque<T, A> const& val);
    template<typename K, typename C, typename A> 
      std::size_t hash_value(std::set<K, C, A> const& val);
    template<typename K, typename C, typename A> 
      std::size_t hash_value(std::multiset<K, C, A> const& val);
    template<typename K, typename T, typename C, typename A> 
      std::size_t hash_value(std::map<K, T, C, A> const& val);
    template<typename K, typename T, typename C, typename A> 
      std::size_t hash_value(std::multimap<K, T, C, A> const& val);
    template<typename T> std::size_t hash_value(std::complex<T> const& val);

    通常不應該由用戶直接調用,他們應該使用 boost::hash, boost::hash_rangeboost::hash_combine,它們以不帶名字空間限定的方式調用 hash_value,以便通過 ADL 找到對定制類型的重載。

    注意:

    這是一個對 TR1 的擴展

    拋出:

    只有用戶使用的 hash_value 版本對於一個容器的元素或儲存在一個 pair 中的類型會拋出時,才會拋出。

    返回:

    類型 返回
    bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long val
    long long, unsigned long long val when abs(val) <= std::numeric_limits<std::size_t>::max().
    float, double, long double 一個不定的值,但是對於相等的參數應該導致同樣的結果。
    T* 一個不定的值,但是對於相等的參數應該導致同樣的結果。
    T val[N], const T val[N] hash_range(val, val+N)
    std:basic_string<Ch, std::char_traits<Ch>, A>, std::vector<T, A>, std::list<T, A>, std::deque<T, A>, std::set<K, C, A>, std::multiset<K, C, A>, std::map<K, T, C, A>, std::multimap<K, T, C, A> hash_range(val.begin(), val.end())
    std::pair<A, B>
    size_t seed = 0;
    hash_combine(seed, val.first);
    hash_combine(seed, val.second);
    return seed;
    std::complex<T> T 是一個內建類型,且 val.imag() == 0,結果與 hash_value(val.real()) 相等。否則是一個不定的值,但是對於相等的參數應該導致同樣的結果。

PrevUpHomeNext