Я ищу информацию о том, какой алгоритм sh используется в специализации C ++ std::hash<std::string>
. Самое близкое, что я мог получить, - это информация из моего include/c++/7/bits/basic_string.h
:
/// std::hash specialization for string.
template<>
struct hash<string>
: public __hash_base<size_t, string>
{
size_t
operator()(const string& __s) const noexcept
{ return std::_Hash_impl::hash(__s.data(), __s.length()); }
};
Затем include/c++/7/bits/functional_hash.h
:
struct _Hash_impl
{
static size_t
hash(const void* __ptr, size_t __clength,
size_t __seed = static_cast<size_t>(0xc70f6907UL))
{ return _Hash_bytes(__ptr, __clength, __seed); }
template<typename _Tp>
static size_t
hash(const _Tp& __val)
{ return hash(&__val, sizeof(__val)); }
template<typename _Tp>
static size_t
__hash_combine(const _Tp& __val, size_t __hash)
{ return hash(&__val, sizeof(__val), __hash); }
};
И наконец include/c++/7/bits/hash_bytes.h
:
// Hash function implementation for the nontrivial specialization.
// All of them are based on a primitive that hashes a pointer to a
// byte array. The actual hash algorithm is not guaranteed to stay
// the same from release to release -- it may be updated or tuned to
// improve hash quality or speed.
size_t
_Hash_bytes(const void* __ptr, size_t __len, size_t __seed);
На самом деле есть два вопроса:
- Означает ли это, что C ++ использует одни и те же алгоритмы ha sh для всех нетривиальных типов данных?
- Какой алгоритм использует C ++ использует для
_Hash_bytes
?