Advertisement
Guest User

Untitled

a guest
Dec 3rd, 2016
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.93 KB | None | 0 0
  1. #include <stdint.h>
  2. #include <string.h>
  3. #include <assert.h>
  4.  
  5. static inline uint64_t
  6. diffuse(uint64_t val)
  7. {
  8. uint64_t a, b;
  9. val *= 0x6eed0e9da4d94a4fULL;
  10. //a = val >> 32;
  11. //b = val >> 60;
  12. //val ^= a >> b;
  13. val ^= (val << 17) | (val >> (64 - 17));
  14. val *= 0x6eed0e9da4d94a4fULL;
  15. return val;
  16. }
  17.  
  18.  
  19. void sea_hash_test(const void *key, int len, uint32_t seed, void *out) {
  20. uint64_t a, b, c, d;
  21. uint64_t s = seed;
  22. uint64_t *p;
  23. unsigned char pad[8] = {0};
  24.  
  25. a = 0x16f11fe89b0d677cULL ^ s;
  26. b = 0xb480a793d8e6c86cULL;
  27. c = 0x6fe2e5aaf078ebc9ULL;
  28. d = 0x14f994a4c5259381ULL;
  29.  
  30. p = (uint64_t *)key;
  31. while (len >= 32) {
  32. a ^= *p++;
  33. b ^= *p++;
  34. c ^= *p++;
  35. d ^= *p++;
  36. a = diffuse(a);
  37. b = diffuse(b);
  38. c = diffuse(c);
  39. d = diffuse(d);
  40. len -= 32;
  41. }
  42.  
  43. switch (len) {
  44. case 25 ... 31:
  45. a ^= *p++;
  46. b ^= *p++;
  47. c ^= *p++;
  48. memcpy(pad, p, len - 24);
  49. d ^= *(uint64_t *)pad;
  50. a = diffuse(a);
  51. b = diffuse(b);
  52. c = diffuse(c);
  53. d = diffuse(d);
  54. break;
  55. case 24:
  56. a ^= *p++;
  57. b ^= *p++;
  58. c ^= *p++;
  59. a = diffuse(a);
  60. b = diffuse(b);
  61. c = diffuse(c);
  62. break;
  63. case 17 ... 23:
  64. a ^= *p++;
  65. b ^= *p++;
  66. memcpy(pad, p, len - 16);
  67. c ^= *(uint64_t *)pad;
  68. a = diffuse(a);
  69. b = diffuse(b);
  70. c = diffuse(c);
  71. break;
  72. case 16:
  73. a ^= *p++;
  74. b ^= *p++;
  75. a = diffuse(a);
  76. b = diffuse(b);
  77. break;
  78. case 9 ... 15:
  79. a ^= *p++;
  80. memcpy(pad, p, len - 8);
  81. b ^= *(uint64_t *)pad;
  82. a = diffuse(a);
  83. b = diffuse(b);
  84. break;
  85. case 8:
  86. a ^= *p++;
  87. a = diffuse(a);
  88. break;
  89. case 1 ... 7:
  90. memcpy(pad, p, len);
  91. a ^= *(uint64_t *)pad;
  92. a = diffuse(a);
  93. break;
  94. case 0:
  95. break;
  96. default:
  97. assert(0);
  98. }
  99.  
  100. a ^= b;
  101. c ^= d;
  102. a ^= c;
  103. a ^= (uint64_t)len;
  104. uint64_t r = diffuse(a);
  105. memcpy(out, &r, 8);
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement