78#include <linux/types.h>
80#define XXH_API static inline __attribute__((unused))
124static inline unsigned long xxhash(
const void *
input,
size_t length,
127 if (
sizeof(
size_t) == 8)
299#include <asm/unaligned.h>
300#include <linux/errno.h>
301#include <linux/kernel.h>
302#include <linux/module.h>
303#include <linux/xxhash.h>
308#define xxh_rotl32(x, r) ((x << r) | (x >> (32 - r)))
309#define xxh_rotl64(x, r) ((x << r) | (x >> (64 - r)))
311#ifdef __LITTLE_ENDIAN
312# define XXH_CPU_LITTLE_ENDIAN 1
314# define XXH_CPU_LITTLE_ENDIAN 0
320static const uint32_t PRIME32_1 = 2654435761U;
321static const uint32_t PRIME32_2 = 2246822519U;
322static const uint32_t PRIME32_3 = 3266489917U;
323static const uint32_t PRIME32_4 = 668265263U;
324static const uint32_t PRIME32_5 = 374761393U;
326static const uint64_t PRIME64_1 = 11400714785074694791ULL;
327static const uint64_t PRIME64_2 = 14029467366897019727ULL;
328static const uint64_t PRIME64_3 = 1609587929392839161ULL;
329static const uint64_t PRIME64_4 = 9650029242287828579ULL;
330static const uint64_t PRIME64_5 = 2870177450012600261ULL;
337 __builtin_memcpy(
dst,
src,
sizeof(*
dst));
342 __builtin_memcpy(
dst,
src,
sizeof(*
dst));
348static uint32_t xxh32_round(uint32_t
seed,
const uint32_t
input)
358 const uint8_t *p = (
const uint8_t *)
input;
359 const uint8_t *b_end = p +
len;
363 const uint8_t *
const limit = b_end - 16;
364 uint32_t v1 =
seed + PRIME32_1 + PRIME32_2;
365 uint32_t v2 =
seed + PRIME32_2;
366 uint32_t v3 =
seed + 0;
367 uint32_t v4 =
seed - PRIME32_1;
370 v1 = xxh32_round(v1, get_unaligned_le32(p));
372 v2 = xxh32_round(v2, get_unaligned_le32(p));
374 v3 = xxh32_round(v3, get_unaligned_le32(p));
376 v4 = xxh32_round(v4, get_unaligned_le32(p));
378 }
while (p <=
limit);
383 h32 =
seed + PRIME32_5;
386 h32 += (uint32_t)
len;
388 while (p + 4 <= b_end) {
389 h32 += get_unaligned_le32(p) * PRIME32_3;
395 h32 += (*p) * PRIME32_5;
409static uint64_t xxh64_round(uint64_t acc,
const uint64_t
input)
411 acc +=
input * PRIME64_2;
417static uint64_t xxh64_merge_round(uint64_t acc, uint64_t val)
419 val = xxh64_round(0, val);
421 acc = acc * PRIME64_1 + PRIME64_4;
427 const uint8_t *p = (
const uint8_t *)
input;
428 const uint8_t *
const b_end = p +
len;
432 const uint8_t *
const limit = b_end - 32;
433 uint64_t v1 =
seed + PRIME64_1 + PRIME64_2;
434 uint64_t v2 =
seed + PRIME64_2;
435 uint64_t v3 =
seed + 0;
436 uint64_t v4 =
seed - PRIME64_1;
439 v1 = xxh64_round(v1, get_unaligned_le64(p));
441 v2 = xxh64_round(v2, get_unaligned_le64(p));
443 v3 = xxh64_round(v3, get_unaligned_le64(p));
445 v4 = xxh64_round(v4, get_unaligned_le64(p));
447 }
while (p <=
limit);
451 h64 = xxh64_merge_round(h64, v1);
452 h64 = xxh64_merge_round(h64, v2);
453 h64 = xxh64_merge_round(h64, v3);
454 h64 = xxh64_merge_round(h64, v4);
457 h64 =
seed + PRIME64_5;
460 h64 += (uint64_t)
len;
462 while (p + 8 <= b_end) {
463 const uint64_t k1 = xxh64_round(0, get_unaligned_le64(p));
466 h64 =
xxh_rotl64(h64, 27) * PRIME64_1 + PRIME64_4;
470 if (p + 4 <= b_end) {
471 h64 ^= (uint64_t)(get_unaligned_le32(p)) * PRIME64_1;
472 h64 =
xxh_rotl64(h64, 23) * PRIME64_2 + PRIME64_3;
477 h64 ^= (*p) * PRIME64_5;
499 __builtin_memset(&state, 0,
sizeof(state));
500 state.
v1 =
seed + PRIME32_1 + PRIME32_2;
501 state.
v2 =
seed + PRIME32_2;
503 state.
v4 =
seed - PRIME32_1;
504 __builtin_memcpy(statePtr, &state,
sizeof(state));
512 __builtin_memset(&state, 0,
sizeof(state));
513 state.
v1 =
seed + PRIME64_1 + PRIME64_2;
514 state.
v2 =
seed + PRIME64_2;
516 state.
v4 =
seed - PRIME64_1;
517 __builtin_memcpy(statePtr, &state,
sizeof(state));
522 const uint8_t *p = (
const uint8_t *)
input;
523 const uint8_t *
const b_end = p +
len;
538 const uint32_t *p32 = state->
mem32;
543 state->
v1 = xxh32_round(state->
v1, get_unaligned_le32(p32));
545 state->
v2 = xxh32_round(state->
v2, get_unaligned_le32(p32));
547 state->
v3 = xxh32_round(state->
v3, get_unaligned_le32(p32));
549 state->
v4 = xxh32_round(state->
v4, get_unaligned_le32(p32));
556 if (p <= b_end - 16) {
557 const uint8_t *
const limit = b_end - 16;
558 uint32_t
v1 = state->
v1;
559 uint32_t
v2 = state->
v2;
560 uint32_t
v3 = state->
v3;
561 uint32_t
v4 = state->
v4;
564 v1 = xxh32_round(
v1, get_unaligned_le32(p));
566 v2 = xxh32_round(
v2, get_unaligned_le32(p));
568 v3 = xxh32_round(
v3, get_unaligned_le32(p));
570 v4 = xxh32_round(
v4, get_unaligned_le32(p));
572 }
while (p <=
limit);
581 __builtin_memcpy(state->
mem32, p, (
size_t)(b_end-p));
582 state->
memsize = (uint32_t)(b_end-p);
590 const uint8_t *p = (
const uint8_t *)state->
mem32;
591 const uint8_t *
const b_end = (
const uint8_t *)(state->
mem32) +
599 h32 = state->
v3 + PRIME32_5;
604 while (p + 4 <= b_end) {
605 h32 += get_unaligned_le32(p) * PRIME32_3;
611 h32 += (*p) * PRIME32_5;
627 const uint8_t *p = (
const uint8_t *)
input;
628 const uint8_t *
const b_end = p +
len;
642 uint64_t *p64 = state->
mem64;
644 __builtin_memcpy(((uint8_t *)p64) + state->
memsize,
input,
647 state->
v1 = xxh64_round(state->
v1, get_unaligned_le64(p64));
649 state->
v2 = xxh64_round(state->
v2, get_unaligned_le64(p64));
651 state->
v3 = xxh64_round(state->
v3, get_unaligned_le64(p64));
653 state->
v4 = xxh64_round(state->
v4, get_unaligned_le64(p64));
659 if (p + 32 <= b_end) {
660 const uint8_t *
const limit = b_end - 32;
661 uint64_t
v1 = state->
v1;
662 uint64_t
v2 = state->
v2;
663 uint64_t
v3 = state->
v3;
664 uint64_t
v4 = state->
v4;
667 v1 = xxh64_round(
v1, get_unaligned_le64(p));
669 v2 = xxh64_round(
v2, get_unaligned_le64(p));
671 v3 = xxh64_round(
v3, get_unaligned_le64(p));
673 v4 = xxh64_round(
v4, get_unaligned_le64(p));
675 }
while (p <=
limit);
684 __builtin_memcpy(state->
mem64, p, (
size_t)(b_end-p));
685 state->
memsize = (uint32_t)(b_end - p);
693 const uint8_t *p = (
const uint8_t *)state->
mem64;
694 const uint8_t *
const b_end = (
const uint8_t *)state->
mem64 +
699 const uint64_t
v1 = state->
v1;
700 const uint64_t
v2 = state->
v2;
701 const uint64_t
v3 = state->
v3;
702 const uint64_t
v4 = state->
v4;
706 h64 = xxh64_merge_round(h64,
v1);
707 h64 = xxh64_merge_round(h64,
v2);
708 h64 = xxh64_merge_round(h64,
v3);
709 h64 = xxh64_merge_round(h64,
v4);
711 h64 = state->
v3 + PRIME64_5;
716 while (p + 8 <= b_end) {
717 const uint64_t k1 = xxh64_round(0, get_unaligned_le64(p));
720 h64 =
xxh_rotl64(h64, 27) * PRIME64_1 + PRIME64_4;
724 if (p + 4 <= b_end) {
725 h64 ^= (uint64_t)(get_unaligned_le32(p)) * PRIME64_1;
726 h64 =
xxh_rotl64(h64, 23) * PRIME64_2 + PRIME64_3;
731 h64 ^= (*p) * PRIME64_5;
char * dst
Definition lz4.h:833
const char * src
Definition lz4.h:866
#define input(b, o, c, n, m)
Definition compress42.c:610
uint32_t mem32[4]
Definition xxhash.h:153
uint32_t v3
Definition xxhash.h:151
uint32_t v2
Definition xxhash.h:150
uint32_t total_len_32
Definition xxhash.h:147
uint32_t large_len
Definition xxhash.h:148
uint32_t v4
Definition xxhash.h:152
uint32_t memsize
Definition xxhash.h:154
uint32_t v1
Definition xxhash.h:149
uint64_t v4
Definition xxhash.h:165
uint64_t v3
Definition xxhash.h:164
uint64_t v1
Definition xxhash.h:162
uint64_t mem64[4]
Definition xxhash.h:166
uint32_t memsize
Definition xxhash.h:167
uint64_t v2
Definition xxhash.h:163
uint64_t total_len
Definition xxhash.h:161
XXH_API void xxh64_copy_state(struct xxh64_state *dst, const struct xxh64_state *src)
Definition xxhash.h:340
XXH_API uint32_t xxh32(const void *input, size_t length, uint32_t seed)
Definition xxhash.h:356
#define xxh_rotl64(x, r)
Definition xxhash.h:309
XXH_API int xxh32_update(struct xxh32_state *state, const void *input, size_t length)
Definition xxhash.h:520
XXH_API int xxh64_update(struct xxh64_state *state, const void *input, size_t length)
Definition xxhash.h:625
XXH_API uint64_t xxh64(const void *input, size_t length, uint64_t seed)
Definition xxhash.h:425
XXH_API uint32_t xxh32_digest(const struct xxh32_state *state)
Definition xxhash.h:588
XXH_API void xxh64_reset(struct xxh64_state *state, uint64_t seed)
Definition xxhash.h:507
XXH_API uint64_t xxh64_digest(const struct xxh64_state *state)
Definition xxhash.h:691
#define XXH_API
Definition xxhash.h:80
#define xxh_rotl32(x, r)
Definition xxhash.h:308
XXH_API void xxh32_reset(struct xxh32_state *state, uint32_t seed)
Definition xxhash.h:494
XXH_API void xxh32_copy_state(struct xxh32_state *dst, const struct xxh32_state *src)
Definition xxhash.h:335
#define NULL
Definition getopt1.c:37
static uint32_t const uint8_t uint32_t len
Definition memcmplen.h:44
static uint32_t const uint8_t uint32_t uint32_t limit
Definition memcmplen.h:45
#define EINVAL
Definition errno.h:13
uint32_t seed
Definition stream_decompress.c:26