LLVM  8.0.1
Classes | Functions | Variables
llvm::hashing::detail Namespace Reference

Classes

struct  hash_combine_recursive_helper
 Helper class to manage the recursive combining of hash_combine arguments. More...
 
struct  hash_state
 The intermediate state used during hashing. More...
 
struct  is_hashable_data
 Trait to indicate whether a type's bits can be hashed directly. More...
 
struct  is_hashable_data< std::pair< T, U > >
 

Functions

uint64_t fetch64 (const char *p)
 
uint32_t fetch32 (const char *p)
 
uint64_t rotate (uint64_t val, size_t shift)
 Bitwise right rotate. More...
 
uint64_t shift_mix (uint64_t val)
 
uint64_t hash_16_bytes (uint64_t low, uint64_t high)
 
uint64_t hash_1to3_bytes (const char *s, size_t len, uint64_t seed)
 
uint64_t hash_4to8_bytes (const char *s, size_t len, uint64_t seed)
 
uint64_t hash_9to16_bytes (const char *s, size_t len, uint64_t seed)
 
uint64_t hash_17to32_bytes (const char *s, size_t len, uint64_t seed)
 
uint64_t hash_33to64_bytes (const char *s, size_t len, uint64_t seed)
 
uint64_t hash_short (const char *s, size_t length, uint64_t seed)
 
uint64_t get_execution_seed ()
 
template<typename T >
std::enable_if< is_hashable_data< T >::value, T >::type get_hashable_data (const T &value)
 Helper to get the hashable data representation for a type. More...
 
template<typename T >
std::enable_if<!is_hashable_data< T >::value, size_t >::type get_hashable_data (const T &value)
 Helper to get the hashable data representation for a type. More...
 
template<typename T >
bool store_and_advance (char *&buffer_ptr, char *buffer_end, const T &value, size_t offset=0)
 Helper to store data from a value into a buffer and advance the pointer into that buffer. More...
 
template<typename InputIteratorT >
hash_code hash_combine_range_impl (InputIteratorT first, InputIteratorT last)
 Implement the combining of integral values into a hash_code. More...
 
template<typename ValueT >
std::enable_if< is_hashable_data< ValueT >::value, hash_code >::type hash_combine_range_impl (ValueT *first, ValueT *last)
 Implement the combining of integral values into a hash_code. More...
 
hash_code hash_integer_value (uint64_t value)
 Helper to hash the value of a single integer. More...
 

Variables

static const uint64_t k0 = 0xc3a5c85c97cb3127ULL
 Some primes between 2^63 and 2^64 for various uses. More...
 
static const uint64_t k1 = 0xb492b66fbe98f273ULL
 
static const uint64_t k2 = 0x9ae16a3b2f90404fULL
 
static const uint64_t k3 = 0xc949d7c7509e6557ULL
 
uint64_t fixed_seed_override = 0
 A global, fixed seed-override variable. More...
 

Function Documentation

◆ fetch32()

uint32_t llvm::hashing::detail::fetch32 ( const char p)
inline

◆ fetch64()

uint64_t llvm::hashing::detail::fetch64 ( const char p)
inline

◆ get_execution_seed()

uint64_t llvm::hashing::detail::get_execution_seed ( )
inline

Definition at line 321 of file Hashing.h.

References fixed_seed_override.

Referenced by hash_combine_range_impl(), and hash_integer_value().

◆ get_hashable_data() [1/2]

template<typename T >
std::enable_if<is_hashable_data<T>::value, T>::type llvm::hashing::detail::get_hashable_data ( const T value)

Helper to get the hashable data representation for a type.

This variant is enabled when the type itself can be used.

Definition at line 365 of file Hashing.h.

◆ get_hashable_data() [2/2]

template<typename T >
std::enable_if<!is_hashable_data<T>::value, size_t>::type llvm::hashing::detail::get_hashable_data ( const T value)

Helper to get the hashable data representation for a type.

This variant is enabled when we must first call hash_value and use the result as our data.

Definition at line 373 of file Hashing.h.

References llvm::hash_code::hash_value, and hash_value().

◆ hash_16_bytes()

uint64_t llvm::hashing::detail::hash_16_bytes ( uint64_t  low,
uint64_t  high 
)
inline

◆ hash_17to32_bytes()

uint64_t llvm::hashing::detail::hash_17to32_bytes ( const char s,
size_t  len,
uint64_t  seed 
)
inline

Definition at line 210 of file Hashing.h.

References fetch64(), hash_16_bytes(), k0, k1, k2, and rotate.

Referenced by hash_short().

◆ hash_1to3_bytes()

uint64_t llvm::hashing::detail::hash_1to3_bytes ( const char s,
size_t  len,
uint64_t  seed 
)
inline

Definition at line 190 of file Hashing.h.

References k2, and shift_mix().

Referenced by hash_short().

◆ hash_33to64_bytes()

uint64_t llvm::hashing::detail::hash_33to64_bytes ( const char s,
size_t  len,
uint64_t  seed 
)
inline

Definition at line 219 of file Hashing.h.

References fetch64(), k2, rotate, and shift_mix().

Referenced by hash_short().

◆ hash_4to8_bytes()

uint64_t llvm::hashing::detail::hash_4to8_bytes ( const char s,
size_t  len,
uint64_t  seed 
)
inline

Definition at line 199 of file Hashing.h.

References fetch32(), and hash_16_bytes().

Referenced by hash_short().

◆ hash_9to16_bytes()

uint64_t llvm::hashing::detail::hash_9to16_bytes ( const char s,
size_t  len,
uint64_t  seed 
)
inline

Definition at line 204 of file Hashing.h.

References fetch64(), hash_16_bytes(), and rotate.

Referenced by hash_short().

◆ hash_combine_range_impl() [1/2]

template<typename InputIteratorT >
hash_code llvm::hashing::detail::hash_combine_range_impl ( InputIteratorT  first,
InputIteratorT  last 
)

Implement the combining of integral values into a hash_code.

This overload is selected when the value type of the iterator is integral. Rather than computing a hash_code for each object and then combining them, this (as an optimization) directly combines the integers.

Definition at line 403 of file Hashing.h.

References assert(), llvm::hashing::detail::hash_state::create(), llvm::sys::path::end(), llvm::hashing::detail::hash_state::finalize(), first, get_execution_seed(), llvm::get_hashable_data(), hash_short(), llvm::hashing::detail::hash_state::mix(), rotate, and store_and_advance().

◆ hash_combine_range_impl() [2/2]

template<typename ValueT >
std::enable_if<is_hashable_data<ValueT>::value, hash_code>::type llvm::hashing::detail::hash_combine_range_impl ( ValueT first,
ValueT last 
)

Implement the combining of integral values into a hash_code.

This overload is selected when the value type of the iterator is integral and when the input iterator is actually a pointer. Rather than computing a hash_code for each object and then combining them, this (as an optimization) directly combines the integers. Also, because the integers are stored in contiguous memory, this routine avoids copying each value and directly reads from the underlying memory.

Definition at line 447 of file Hashing.h.

References llvm::hashing::detail::hash_state::create(), first, get_execution_seed(), and hash_short().

Referenced by llvm::hash_combine_range().

◆ hash_integer_value()

hash_code llvm::hashing::detail::hash_integer_value ( uint64_t  value)
inline

Helper to hash the value of a single integer.

Overloads for smaller integer types are not provided to ensure consistent behavior in the presence of integral promotions. Essentially, "hash_value('4')" and "hash_value('0' + 4)" should be the same.

Definition at line 617 of file Hashing.h.

References fetch32(), get_execution_seed(), and hash_16_bytes().

Referenced by llvm::hash_value().

◆ hash_short()

uint64_t llvm::hashing::detail::hash_short ( const char s,
size_t  length,
uint64_t  seed 
)
inline

◆ rotate()

uint64_t llvm::hashing::detail::rotate ( uint64_t  val,
size_t  shift 
)
inline

Bitwise right rotate.

Normally this will compile to a single instruction, especially if the shift is a manifest constant.

Definition at line 170 of file Hashing.h.

◆ shift_mix()

uint64_t llvm::hashing::detail::shift_mix ( uint64_t  val)
inline

◆ store_and_advance()

template<typename T >
bool llvm::hashing::detail::store_and_advance ( char *&  buffer_ptr,
char buffer_end,
const T value,
size_t  offset = 0 
)

Helper to store data from a value into a buffer and advance the pointer into that buffer.

This routine first checks whether there is enough space in the provided buffer, and if not immediately returns false. If there is space, it copies the underlying bytes of value into the buffer, advances the buffer_ptr past the copied bytes, and returns true.

Definition at line 386 of file Hashing.h.

References llvm::Intrinsic::memcpy.

Referenced by llvm::hashing::detail::hash_combine_recursive_helper::combine_data(), and hash_combine_range_impl().

Variable Documentation

◆ fixed_seed_override

uint64_t llvm::hashing::detail::fixed_seed_override = 0

A global, fixed seed-override variable.

This variable can be set using the

See also
llvm::set_fixed_execution_seed function. See that function for details. Do not, under any circumstances, set or read this variable.

Definition at line 23 of file Hashing.cpp.

Referenced by llvm::hashing::detail::hash_state::finalize(), get_execution_seed(), and llvm::set_fixed_execution_hash_seed().

◆ k0

const uint64_t llvm::hashing::detail::k0 = 0xc3a5c85c97cb3127ULL
static

Some primes between 2^63 and 2^64 for various uses.

Definition at line 162 of file Hashing.h.

Referenced by hash_17to32_bytes().

◆ k1

const uint64_t llvm::hashing::detail::k1 = 0xb492b66fbe98f273ULL
static

◆ k2

const uint64_t llvm::hashing::detail::k2 = 0x9ae16a3b2f90404fULL
static

Definition at line 164 of file Hashing.h.

Referenced by hash_17to32_bytes(), hash_1to3_bytes(), and hash_33to64_bytes().

◆ k3

const uint64_t llvm::hashing::detail::k3 = 0xc949d7c7509e6557ULL
static

Definition at line 165 of file Hashing.h.