71__host__ __device__
inline uint64_t
xxhash64(
const T& key, uint64_t seed = 0) {
72 const auto* bytes =
reinterpret_cast<const uint8_t*
>(&key);
73 size_t size =
sizeof(T);
79 size_t limit = size - 32;
86 const size_t pipeline_offset = offset / 8;
87 v1 += load_chunk<uint64_t>(bytes, pipeline_offset + 0) *
PRIME64_2;
90 v2 += load_chunk<uint64_t>(bytes, pipeline_offset + 1) *
PRIME64_2;
93 v3 += load_chunk<uint64_t>(bytes, pipeline_offset + 2) *
PRIME64_2;
96 v4 += load_chunk<uint64_t>(bytes, pipeline_offset + 3) *
PRIME64_2;
100 }
while (offset <= limit);
134 if ((size % 32) >= 8) {
135 for (; offset <= size - 8; offset += 8) {
136 uint64_t k1 = load_chunk<uint64_t>(bytes, offset / 8) *
PRIME64_2;
144 if ((size % 8) >= 4) {
145 for (; offset <= size - 4; offset += 4) {
146 h64 ^= (load_chunk<uint32_t>(bytes, offset / 4) & 0xffffffffULL) *
PRIME64_1;
153 while (offset < size) {
154 h64 ^= (bytes[offset] & 0xff) *
PRIME64_5;