2
0

hashing.zig 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. const std = @import("std");
  2. pub fn hashKey(k: []const u8) u32 {
  3. return murmur3(k);
  4. }
  5. pub fn xoramasrosas(k: []const u8) u32 {
  6. var hash: u32 = 17 * 22;
  7. const x = "xoramasrosas";
  8. for (k, 0..) |char, i| {
  9. hash = hash +% (char ^ x[i % 12]) << 12;
  10. }
  11. return hash;
  12. }
  13. pub fn djb2(key: []const u8) u32 {
  14. var hash: u32 = 5381;
  15. for (key) |c| {
  16. hash = ((hash << 5) +% hash) +% c;
  17. }
  18. return hash;
  19. }
  20. pub fn murmur3(key: []const u8) u32 {
  21. const seed: u32 = 0;
  22. var hash: u32 = seed;
  23. const c1: u32 = 0xcc9e2d51;
  24. const c2: u32 = 0x1b873593;
  25. var i: usize = 0;
  26. while (i + 4 <= key.len) : (i += 4) {
  27. var k: u32 = @as(u32, key[i]) |
  28. (@as(u32, key[i + 1]) << 8) |
  29. (@as(u32, key[i + 2]) << 16) |
  30. (@as(u32, key[i + 3]) << 24);
  31. k *%= c1;
  32. k = (k << 15) | (k >> 17);
  33. k *%= c2;
  34. hash ^= k;
  35. hash = (hash << 13) | (hash >> 19);
  36. hash = hash *% 5 +% 0xe6546b64;
  37. }
  38. var k: u32 = 0;
  39. const remaining = key.len - i;
  40. if (remaining >= 3) k ^= @as(u32, key[i + 2]) << 16;
  41. if (remaining >= 2) k ^= @as(u32, key[i + 1]) << 8;
  42. if (remaining >= 1) {
  43. k ^= @as(u32, key[i]);
  44. k *%= c1;
  45. k = (k << 15) | (k >> 17);
  46. k *%= c2;
  47. hash ^= k;
  48. }
  49. hash ^= @as(u32, @intCast(key.len));
  50. hash ^= hash >> 16;
  51. hash *%= 0x85ebca6b;
  52. hash ^= hash >> 13;
  53. hash *%= 0xc2b2ae35;
  54. hash ^= hash >> 16;
  55. return hash;
  56. }
  57. pub fn xxhash32(key: []const u8) u32 {
  58. const PRIME1: u32 = 2654435761;
  59. const PRIME2: u32 = 2246822519;
  60. const PRIME3: u32 = 3266489917;
  61. const PRIME4: u32 = 668265263;
  62. const PRIME5: u32 = 374761393;
  63. var hash: u32 = PRIME5 +% @as(u32, @intCast(key.len));
  64. var i: usize = 0;
  65. while (i + 4 <= key.len) : (i += 4) {
  66. const k: u32 = @as(u32, key[i]) |
  67. (@as(u32, key[i + 1]) << 8) |
  68. (@as(u32, key[i + 2]) << 16) |
  69. (@as(u32, key[i + 3]) << 24);
  70. hash +%= k *% PRIME3;
  71. hash = ((hash << 17) | (hash >> 15)) *% PRIME4;
  72. }
  73. while (i < key.len) : (i += 1) {
  74. hash +%= @as(u32, key[i]) *% PRIME5;
  75. hash = ((hash << 11) | (hash >> 21)) *% PRIME1;
  76. }
  77. hash ^= hash >> 15;
  78. hash *%= PRIME2;
  79. hash ^= hash >> 13;
  80. hash *%= PRIME3;
  81. hash ^= hash >> 16;
  82. return hash;
  83. }
  84. pub fn wyhash(key: []const u8) u32 {
  85. return @as(u32, @truncate(std.hash.Wyhash.hash(0, key)));
  86. }