5#ifndef V8_BASE_HASHING_H_
6#define V8_BASE_HASHING_H_
78#if V8_HOST_ARCH_32_BIT
79 const uint32_t c1 = 0xCC9E2D51;
80 const uint32_t c2 = 0x1B873593;
88 seed = seed * 5 + 0xE6546B64;
90 const uint64_t
m = uint64_t{0xC6A4A7935BD1E995};
91 const uint32_t
r = 47;
120 template <
typename T>
126 template <
typename Iterator>
131 for (; first != last; ++first)
Add(*first);
136 template <
typename C>
138 ->
decltype(
AddRange(std::begin(collection), std::end(collection))) {
139 return AddRange(std::begin(collection), std::end(collection));
143 template <
typename... T>
144 constexpr static size_t Combine(
const T&... ts) {
146 (..., hasher.
Add(ts));
147 return hasher.
hash();
167 return static_cast<size_t>(v);
170 switch (
sizeof(
size_t)) {
179 return static_cast<size_t>(v);
185 v = (v + (v << 3)) + (v << 8);
187 v = (v + (v << 2)) + (v << 4);
190 return static_cast<size_t>(v);
198#define V8_BASE_HASH_VALUE_TRIVIAL(type) \
199 V8_INLINE size_t hash_value(type v) { return static_cast<size_t>(v); }
203#undef V8_BASE_HASH_VALUE_TRIVIAL
217#define V8_BASE_HASH_VALUE_SIGNED(type) \
218 V8_INLINE size_t hash_value(signed type v) { \
219 return hash_value(base::bit_cast<unsigned type>(v)); \
226#undef V8_BASE_HASH_VALUE_SIGNED
238template <
typename T,
size_t N>
243template <
typename T,
size_t N>
250 return hash_value(
reinterpret_cast<uintptr_t
>(v));
253template <
typename T1,
typename T2>
258template <
typename...
T,
size_t...
I>
260 std::index_sequence<I...>) {
264template <
typename... T>
271 requires std::is_enum<T>::value
273 return hash_value(
static_cast<std::underlying_type_t<T>
>(v));
278 requires requires(
const T& t) {
279 { t.hash_value() } -> std::convertible_to<size_t>;
282 return v.hash_value();
287 {
hash_value(t) } -> std::convertible_to<size_t>;
301template <
typename... Ts>
307template <
typename Iterator>
326#define V8_BASE_BIT_SPECIALIZE_TRIVIAL(type) \
328 struct bit_equal_to<type> : public std::equal_to<type> {}; \
330 struct bit_hash<type> : public hash<type> {};
341#undef V8_BASE_BIT_SPECIALIZE_TRIVIAL
343#define V8_BASE_BIT_SPECIALIZE_BIT_CAST(type, btype) \
345 struct bit_equal_to<type> { \
346 V8_INLINE bool operator()(type lhs, type rhs) const { \
347 return base::bit_cast<btype>(lhs) == base::bit_cast<btype>(rhs); \
351 struct bit_hash<type> { \
352 V8_INLINE size_t operator()(type v) const { \
354 return h(base::bit_cast<btype>(v)); \
359#undef V8_BASE_BIT_SPECIALIZE_BIT_CAST
auto AddRange(C collection) -> decltype(AddRange(std::begin(collection), std::end(collection)))
Hasher & AddRange(Iterator first, Iterator last)
constexpr Hasher()=default
constexpr Hasher(size_t seed)
constexpr size_t hash() const
Hasher & AddHash(size_t other_hash)
static constexpr size_t Combine(const T &... ts)
#define V8_BASE_BIT_SPECIALIZE_BIT_CAST(type, btype)
#define V8_BASE_HASH_VALUE_TRIVIAL(type)
#define V8_BASE_BIT_SPECIALIZE_TRIVIAL(type)
#define V8_BASE_HASH_VALUE_SIGNED(type)
constexpr uint32_t RotateRight32(uint32_t value, uint32_t shift)
V8_INLINE size_t hash_value(unsigned int v)
V8_INLINE size_t hash_combine(size_t seed, size_t hash)
V8_INLINE size_t hash_range(Iterator first, Iterator last)
V8_INLINE size_t hash_value_unsigned_impl(T v)
V8_INLINE size_t hash_value_impl(std::tuple< T... > const &v, std::index_sequence< I... >)
V8_INLINE Dest bit_cast(Source const &source)
#define I(name, number_of_args, result_size)
V8_INLINE constexpr size_t operator()(const T &v) const