19 #include <unordered_map>
29 #if OIIO_VERSION < OIIO_MAKE_VERSION(3,0,0)
39 using std::unordered_map;
66 static inline uint64_t mix(uint64_t
h) {
68 h *= 0x2127599bf4325c37ULL;
73 inline uint64_t
fasthash64(
const void *
buf,
size_t len, uint64_t seed=1771)
75 const uint64_t m = 0x880355f21e6d1965ULL;
76 const uint64_t *pos = (
const uint64_t *)buf;
77 const uint64_t *
end = pos + (len / 8);
78 const unsigned char *pos2;
79 uint64_t h = seed ^ (len * m);
93 pos2 = (
const unsigned char*)pos;
97 case 7: v ^= (uint64_t)pos2[6] << 48;
98 case 6: v ^= (uint64_t)pos2[5] << 40;
99 case 5: v ^= (uint64_t)pos2[4] << 32;
100 case 4: v ^= (uint64_t)pos2[3] << 24;
101 case 3: v ^= (uint64_t)pos2[2] << 16;
102 case 2: v ^= (uint64_t)pos2[1] << 8;
103 case 1: v ^= (uint64_t)pos2[0];
113 const uint64_t m = 0x880355f21e6d1965ULL;
114 uint64_t h = (buf.size() *
sizeof(uint64_t)) * m;
115 for (
const uint64_t
v : buf) {
132 unsigned long long OIIO_API XXH64 (
const void* input,
size_t length,
133 unsigned long long seed=1771);
135 inline size_t xxhash (
const void* input,
size_t length,
size_t seed=1771)
137 return size_t (XXH64 (input, length, (
unsigned long long)seed));
140 template <
typename Str>
141 inline size_t xxhash (
const Str&
s,
size_t seed=1771) {
142 assert(
sizeof(s[0]) == 1);
143 return xxhash (s.data(), s.length(), seed);
159 #if defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 320
160 return __funnelshift_lc(x, x, k);
162 return (x << k) | (x >> (32 - k));
169 return (x << k) | (x >> (64 - k));
199 inline uint64_t
bjfinal64 (uint64_t h0, uint64_t h1, uint64_t h2, uint64_t h3)
201 h3 ^= h2; h2 =
rotl64(h2,15); h3 += h2;
202 h0 ^= h3; h3 =
rotl64(h3,52); h0 += h3;
203 h1 ^= h0; h0 =
rotl64(h0,26); h1 += h0;
204 h2 ^= h1; h1 =
rotl64(h1,51); h2 += h1;
205 h3 ^= h2; h2 =
rotl64(h2,28); h3 += h2;
206 h0 ^= h3; h3 =
rotl64(h3,9); h0 += h3;
207 h1 ^= h0; h0 =
rotl64(h0,47); h1 += h0;
208 h2 ^= h1; h1 =
rotl64(h1,54); h2 += h1;
209 h3 ^= h2; h2 =
rotl64(h2,32); h3 += h2;
210 h0 ^= h3; h3 =
rotl64(h3,25); h0 += h3;
211 h1 ^= h0; h0 =
rotl64(h0,63); h1 += h0;
234 h += (
unsigned char)(*s);
256 for (
size_t i = 0; i < len; ++i) {
257 h += (
unsigned char)(s[i]);
288 inline uint64_t
fmix (uint64_t k)
291 k *= 0xff51afd7ed558ccdULL;
293 k *= 0xc4ceb9fe1a85ec53ULL;
309 #if defined(FARMHASH_UINT128_T_DEFINED)
312 return static_cast<uint64_t
>(
x);
316 return static_cast<uint64_t
>(x >> 64);
345 dst.first = src.first;
346 dst.second = src.second;
387 uint64_t seed0, uint64_t seed1);
407 const uint64_t kMul = 0x9ddfea08eb382d69ULL;
431 const uint64_t kMul = 0x9ddfea08eb382d69ULL;
445 const uint64_t kMul = 0x9ddfea08eb382d69ULL;
446 uint64_t
b = x * kMul;
454 #ifndef FARMHASH_NO_CXX_STRING
464 template <
typename Str>
466 assert(
sizeof(s[0]) == 1);
467 return Hash(s.data(), s.length());
473 template <
typename Str>
475 assert(
sizeof(s[0]) == 1);
476 return Hash32(s.data(), s.length());
483 template <
typename Str>
485 assert(
sizeof(s[0]) == 1);
493 template <
typename Str>
495 assert(
sizeof(s[0]) == 1);
496 return Hash64(s.data(), s.length());
503 template <
typename Str>
505 assert(
sizeof(s[0]) == 1);
513 template <
typename Str>
515 assert(
sizeof(s[0]) == 1);
522 template <
typename Str>
524 assert(
sizeof(s[0]) == 1);
525 return Hash128(s.data(), s.length());
532 template <
typename Str>
534 assert(
sizeof(s[0]) == 1);
535 return Hash128(s.data(), s.length(), seed);
541 template <
typename Str>
543 assert(
sizeof(s[0]) == 1);
549 template <
typename Str>
551 assert(
sizeof(s[0]) == 1);
556 template <
typename Str>
558 assert(
sizeof(s[0]) == 1);
582 void append (
const void *
data,
size_t size);
596 unsigned char hash[20];
600 void gethash (
Hash &
h);
607 std::string digest ();
610 static std::string
digest (
const void *data,
size_t size) {
GLenum GLuint GLenum GLsizei const GLchar * buf
OIIO_HOSTDEVICE constexpr uint64_t Uint128Low64(const uint128_t x)
uint128_t OIIO_API Hash128WithSeed(const char *s, size_t len, uint128_t seed)
OIIO_HOSTDEVICE uint32_t bjfinal(uint32_t a, uint32_t b, uint32_t c=0xdeadbeef)
size_t xxhash(const Str &s, size_t seed=1771)
size_t strhash(const char *s)
uint32_t OIIO_API hashlittle(const void *key, size_t length, uint32_t seed=1771)
GLboolean GLboolean GLboolean GLboolean a
GLuint GLsizei GLsizei * length
Type for storing the raw bits of the hash.
void append(string_view s)
Append more data from a string_view.
unsigned long long OIIO_API XXH64(const void *input, size_t length, unsigned long long seed=1771)
OIIO_HOSTDEVICE OIIO_CONSTEXPR14 uint64_t Hash128to64(uint128_t x)
uint64_t OIIO_API Hash64WithSeeds(const char *s, size_t len, uint64_t seed0, uint64_t seed1)
size_t OIIO_API Hash(const char *s, size_t len)
OIIO_HOSTDEVICE OIIO_CONSTEXPR14 uint128_t Uint128(uint64_t lo, uint64_t hi)
size_t xxhash(const void *input, size_t length, size_t seed=1771)
unsigned int OIIO_API XXH32(const void *input, size_t length, unsigned seed=1771)
std::string digest()
Return the digest as a hex string.
uint64_t bjfinal64(uint64_t h0, uint64_t h1, uint64_t h2, uint64_t h3)
OIIO_HOSTDEVICE constexpr uint64_t Uint128High64(const uint128_t x)
constexpr size_type size() const noexcept
OIIO_FORCEINLINE OIIO_HOSTDEVICE uint64_t rotl64(uint64_t x, int k)
OIIO_HOSTDEVICE void bjmix(uint32_t &a, uint32_t &b, uint32_t &c)
uint64_t OIIO_API Hash64(const char *s, size_t len)
GLboolean GLboolean GLboolean b
uint32_t OIIO_API Fingerprint32(const char *s, size_t len)
uint128_t OIIO_API Hash128(const char *s, size_t len)
uint32_t fmix(uint32_t h)
uint64_t fasthash64(const void *buf, size_t len, uint64_t seed=1771)
uint64_t OIIO_API Fingerprint64(const char *s, size_t len)
constexpr auto size() const noexcept-> size_t
void append(span< T > v)
Append more data from a span, without thinking about sizes.
GLfloat GLfloat GLfloat GLfloat h
uint64_t OIIO_API Hash64WithSeed(const char *s, size_t len, uint64_t seed)
static std::string digest(const void *data, size_t size)
Roll the whole thing into one functor, return the string digest.
constexpr auto data() const noexcept-> const Char *
OIIO_HOSTDEVICE OIIO_CONSTEXPR14 uint64_t Fingerprint(uint128_t x)
uint32_t OIIO_API hashword(const uint32_t *key, size_t nwords, uint32_t seed=1771)
#define OIIO_NAMESPACE_END
OIIO_HOSTDEVICE OIIO_CONSTEXPR14 void CopyUint128(uint128_t &dst, const uint128_t src)
uint32_t OIIO_API Hash32WithSeed(const char *s, size_t len, uint32_t seed)
OIIO_FORCEINLINE OIIO_HOSTDEVICE uint32_t rotl32(uint32_t x, int k)
constexpr pointer data() const noexcept
uint32_t OIIO_API Hash32(const char *s, size_t len)
std::pair< uint64_t, uint64_t > uint128_t
constexpr size_type length() const noexcept
#define OIIO_NAMESPACE_BEGIN
uint128_t OIIO_API Fingerprint128(const char *s, size_t len)