Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdint.h>
- #include <string.h>
- #include <assert.h>
- static inline uint64_t
- diffuse(uint64_t val)
- {
- uint64_t a, b;
- val *= 0x6eed0e9da4d94a4fULL;
- //a = val >> 32;
- //b = val >> 60;
- //val ^= a >> b;
- val ^= (val << 17) | (val >> (64 - 17));
- val *= 0x6eed0e9da4d94a4fULL;
- return val;
- }
- void sea_hash_test(const void *key, int len, uint32_t seed, void *out) {
- uint64_t a, b, c, d;
- uint64_t s = seed;
- uint64_t *p;
- unsigned char pad[8] = {0};
- a = 0x16f11fe89b0d677cULL ^ s;
- b = 0xb480a793d8e6c86cULL;
- c = 0x6fe2e5aaf078ebc9ULL;
- d = 0x14f994a4c5259381ULL;
- p = (uint64_t *)key;
- while (len >= 32) {
- a ^= *p++;
- b ^= *p++;
- c ^= *p++;
- d ^= *p++;
- a = diffuse(a);
- b = diffuse(b);
- c = diffuse(c);
- d = diffuse(d);
- len -= 32;
- }
- switch (len) {
- case 25 ... 31:
- a ^= *p++;
- b ^= *p++;
- c ^= *p++;
- memcpy(pad, p, len - 24);
- d ^= *(uint64_t *)pad;
- a = diffuse(a);
- b = diffuse(b);
- c = diffuse(c);
- d = diffuse(d);
- break;
- case 24:
- a ^= *p++;
- b ^= *p++;
- c ^= *p++;
- a = diffuse(a);
- b = diffuse(b);
- c = diffuse(c);
- break;
- case 17 ... 23:
- a ^= *p++;
- b ^= *p++;
- memcpy(pad, p, len - 16);
- c ^= *(uint64_t *)pad;
- a = diffuse(a);
- b = diffuse(b);
- c = diffuse(c);
- break;
- case 16:
- a ^= *p++;
- b ^= *p++;
- a = diffuse(a);
- b = diffuse(b);
- break;
- case 9 ... 15:
- a ^= *p++;
- memcpy(pad, p, len - 8);
- b ^= *(uint64_t *)pad;
- a = diffuse(a);
- b = diffuse(b);
- break;
- case 8:
- a ^= *p++;
- a = diffuse(a);
- break;
- case 1 ... 7:
- memcpy(pad, p, len);
- a ^= *(uint64_t *)pad;
- a = diffuse(a);
- break;
- case 0:
- break;
- default:
- assert(0);
- }
- a ^= b;
- c ^= d;
- a ^= c;
- a ^= (uint64_t)len;
- uint64_t r = diffuse(a);
- memcpy(out, &r, 8);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement