mirror of
https://github.com/thunderbrewhq/squall.git
synced 2025-12-12 02:22:30 +00:00
feat(string): add SStrHashHT
This commit is contained in:
parent
f631bdac3b
commit
abb9e8ed79
6 changed files with 277 additions and 0 deletions
87
storm/string/bjhash.cpp
Normal file
87
storm/string/bjhash.cpp
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
#include "storm/string/bjhash.hpp"
|
||||
|
||||
#define mix(a, b, c) \
|
||||
{ \
|
||||
a -= b; \
|
||||
a -= c; \
|
||||
a ^= (c >> 13); \
|
||||
b -= c; \
|
||||
b -= a; \
|
||||
b ^= (a << 8); \
|
||||
c -= a; \
|
||||
c -= b; \
|
||||
c ^= (b >> 13); \
|
||||
a -= b; \
|
||||
a -= c; \
|
||||
a ^= (c >> 12); \
|
||||
b -= c; \
|
||||
b -= a; \
|
||||
b ^= (a << 16); \
|
||||
c -= a; \
|
||||
c -= b; \
|
||||
c ^= (b >> 5); \
|
||||
a -= b; \
|
||||
a -= c; \
|
||||
a ^= (c >> 3); \
|
||||
b -= c; \
|
||||
b -= a; \
|
||||
b ^= (a << 10); \
|
||||
c -= a; \
|
||||
c -= b; \
|
||||
c ^= (b >> 15); \
|
||||
}
|
||||
|
||||
uint32_t bjhash(uint8_t* k, uint32_t length, uint32_t initval) {
|
||||
uint32_t a, b, c, len;
|
||||
|
||||
len = length; // Set up the internal state
|
||||
a = b = 0x9e3779b9; // The golden ratio; an arbitrary value
|
||||
c = initval; // The previous hash value
|
||||
|
||||
// Handle most of the key
|
||||
while (len >= 12) {
|
||||
a += (k[0] + ((uint32_t)k[1] << 8) + ((uint32_t)k[2] << 16) + ((uint32_t)k[3] << 24));
|
||||
b += (k[4] + ((uint32_t)k[5] << 8) + ((uint32_t)k[6] << 16) + ((uint32_t)k[7] << 24));
|
||||
c += (k[8] + ((uint32_t)k[9] << 8) + ((uint32_t)k[10] << 16) + ((uint32_t)k[11] << 24));
|
||||
|
||||
mix(a, b, c);
|
||||
|
||||
k += 12;
|
||||
len -= 12;
|
||||
}
|
||||
|
||||
// Handle the last 11 bytes
|
||||
c += length;
|
||||
switch (len) {
|
||||
// All the case statements fall through
|
||||
case 11:
|
||||
c += ((uint32_t)k[10] << 24);
|
||||
case 10:
|
||||
c += ((uint32_t)k[9] << 16);
|
||||
case 9:
|
||||
c += ((uint32_t)k[8] << 8);
|
||||
case 8:
|
||||
// The first byte of c is reserved for the length
|
||||
b += ((uint32_t)k[7] << 24);
|
||||
case 7:
|
||||
b += ((uint32_t)k[6] << 16);
|
||||
case 6:
|
||||
b += ((uint32_t)k[5] << 8);
|
||||
case 5:
|
||||
b += k[4];
|
||||
case 4:
|
||||
a += ((uint32_t)k[3] << 24);
|
||||
case 3:
|
||||
a += ((uint32_t)k[2] << 16);
|
||||
case 2:
|
||||
a += ((uint32_t)k[1] << 8);
|
||||
case 1:
|
||||
a += k[0];
|
||||
case 0:;
|
||||
// Nothing left to add
|
||||
}
|
||||
mix(a, b, c);
|
||||
|
||||
// Report the result
|
||||
return c;
|
||||
}
|
||||
8
storm/string/bjhash.hpp
Normal file
8
storm/string/bjhash.hpp
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#ifndef STORM_STRING_BJ_HASH_HPP
|
||||
#define STORM_STRING_BJ_HASH_HPP
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
uint32_t bjhash(uint8_t* k, uint32_t length, uint32_t initval);
|
||||
|
||||
#endif
|
||||
Loading…
Add table
Add a link
Reference in a new issue