diff options
| -rw-r--r-- | library/lullaby/crypto.lua | 88 | ||||
| -rw-r--r-- | src/crypto.h | 16 | ||||
| -rw-r--r-- | src/hash/cityhash.c | 431 | ||||
| -rw-r--r-- | src/hash/cityhash.h | 40 | ||||
| -rw-r--r-- | src/hash/farmhash.c | 168 | ||||
| -rw-r--r-- | src/hash/farmhash.h | 8 | ||||
| -rw-r--r-- | src/hash/metrohash.c | 222 | ||||
| -rw-r--r-- | src/hash/metrohash.h | 14 | ||||
| -rw-r--r-- | src/hash/spookyhash.c | 330 | ||||
| -rw-r--r-- | src/hash/spookyhash.h | 17 | ||||
| -rw-r--r-- | src/hash/xxh.c | 155 | ||||
| -rw-r--r-- | src/hash/xxh.h | 25 | ||||
| -rw-r--r-- | tests/hash.lua | 13 |
13 files changed, 2 insertions, 1525 deletions
diff --git a/library/lullaby/crypto.lua b/library/lullaby/crypto.lua index 307619b..fa9d768 100644 --- a/library/lullaby/crypto.lua +++ b/library/lullaby/crypto.lua @@ -45,14 +45,6 @@ function crypto.pearson() end ---@param T integer[] function crypto.setpearson(T) end ----@param input string ----@return string -function crypto.xxh64(input) end - ----@param input string ----@return string -function crypto.xxh32(input) end - ---@return hash ---@overload fun(value: string): string function crypto.crc8() end @@ -96,18 +88,6 @@ function crypto.buzhash16(input) end ---@param T integer[] function crypto.setbuzhasah(T) end ----@param input string ----@return string -function crypto.cityhash32(input) end - ----@param input string ----@return string -function crypto.cityhash64(input) end - ----@param input string ----@return string -function crypto.cityhash128(input) end - ---@return hash ---@overload fun(value: string): string function crypto.md5() end @@ -116,24 +96,6 @@ function crypto.md5() end ---@overload fun(value: string): string function crypto.djb2() end ----@param input string ----@return string -function crypto.farmhash32(input) end - ----@param input string ----@return string -function crypto.farmhash64(input) end - ----@param input string ----@param seed integer | nil ----@return string -function crypto.fasthash32(input, seed) end - ----@param input string ----@param seed integer | nil ----@return string -function crypto.fasthash64(input, seed) end - ---@return hash ---@overload fun(value: string): string function crypto.fnv_0() end @@ -157,26 +119,6 @@ function crypto.loselose() end ---@param input string ---@param seed integer | nil ---@return string -function crypto.metrohash64_v1(input, seed) end - ----@param input string ----@param seed integer | nil ----@return string -function crypto.metrohash64_v2(input, seed) end - ----@param input string ----@param seed integer | nil ----@return string -function crypto.metrohash128_v1(input, seed) end - ----@param input string ----@param seed integer | nil ----@return string -function crypto.metrohash128_v2(input, seed) end - ----@param input string ----@param seed integer | nil ----@return string function crypto.murmur1_32(input, seed) end ---@param input string @@ -205,36 +147,6 @@ function crypto.sha384() end ---@overload fun(t, value: string): string function crypto.sha512_t(t) end ----@param input string ----@param seed integer | nil ----@return string -function crypto.spookyhash128_v1(input, seed) end - ----@param input string ----@param seed integer | nil ----@return string -function crypto.spookyhash128_v2(input, seed) end - ----@param input string ----@param seed integer | nil ----@return string -function crypto.spookyhash64_v1(input, seed) end - ----@param input string ----@param seed integer | nil ----@return string -function crypto.spookyhash64_v2(input, seed) end - ----@param input string ----@param seed integer | nil ----@return string -function crypto.spookyhash32_v1(input, seed) end - ----@param input string ----@param seed integer | nil ----@return string -function crypto.spookyhash32_v2(input, seed) end - ---@return hash ---@overload fun(value: string): string ---@overload fun(value: string, length: integer, key: string): string diff --git a/src/crypto.h b/src/crypto.h index 324c170..27adf6f 100644 --- a/src/crypto.h +++ b/src/crypto.h @@ -4,7 +4,6 @@ #include "hash/sha01.h"
#include "hash/sha2xx.h"
#include "hash/pearson.h"
-#include "hash/xxh.h"
#include "hash/adler.h"
#include "hash/bsdchecksum.h"
#include "hash/crc.h"
@@ -12,19 +11,15 @@ #include "hash/sysvchecksum.h"
#include "hash/xor.h"
#include "hash/buzhash.h"
-#include "hash/cityhash.h"
#include "hash/djb2.h"
-#include "hash/farmhash.h"
#include "hash/fasthash.h"
#include "hash/fnv.h"
#include "hash/jenkins.h"
#include "hash/loselose.h"
-#include "hash/metrohash.h"
#include "hash/murmur.h"
#include "hash/pjw.h"
#include "hash/sdbm.h"
#include "hash/sha2-256.h"
-#include "hash/spookyhash.h"
#include "hash/blake2.h"
#include "hash/blake.h"
@@ -115,21 +110,12 @@ int l_##luaname##_update(lua_State* L){\ #define clean_lullaby_crypto luaI_nothing
static const luaL_Reg crypto_function_list [] = {
- {"setpearson",l_setpearson}, {"xxh64",l_xxh64},
- {"xxh32",l_xxh32}, {"fletcher8",l_fletcher8},
+ {"setpearson",l_setpearson}, {"fletcher8",l_fletcher8},
{"fletcher16",l_fletcher16}, {"fletcher32",l_fletcher32},
{"setbuzhash",l_setbuzhash},
- {"cityhash32", l_cityhash32},
- {"cityhash64", l_cityhash64}, {"cityhash128", l_cityhash128},
- {"farmhash32", l_farmhash32}, {"farmhash64", l_farmhash64},
{"fasthash32", l_fasthash32}, {"fasthash64", l_fasthash64},
{"loselose", l_loselose},
- {"metrohash64_v1", l_metrohash64_v1}, {"metrohash64_v2", l_metrohash64_v2},
- {"metrohash128_v1", l_metrohash128_v1}, {"metrohash128_v2", l_metrohash128_v2},
{"murmur1_32", l_murmur1_32}, {"murmur2_32", l_murmur2_32},
- {"spookyhash128_v1", l_spookyhash128_v1}, {"spookyhash128_v2", l_spookyhash128_v2},
- {"spookyhash64_v1", l_spookyhash64_v1}, {"spookyhash64_v2", l_spookyhash64_v2},
- {"spookyhash32_v1", l_spookyhash32_v1}, {"spookyhash32_v2", l_spookyhash32_v2},
{"adler32",l_adler32}, {"adler32_init",l_adler32_init}, {"adler32_update",l_adler32_update}, {"adler32_final",l_adler32_final},
{"bsdchecksum",l_bsdchecksum}, {"bsdchecksum_init",l_bsdchecksum_init}, {"bsdchecksum_update",l_bsdchecksum_update}, {"bsdchecksum_final",l_bsdchecksum_final},
diff --git a/src/hash/cityhash.c b/src/hash/cityhash.c deleted file mode 100644 index 18e35e5..0000000 --- a/src/hash/cityhash.c +++ /dev/null @@ -1,431 +0,0 @@ -#include <stdio.h>
-#include <stdint.h>
-#include <inttypes.h>
-#include "cityhash.h"
-
-uint32_t rot32(uint32_t val, int shift) {
- return ((val >> shift) | (val << (32 - shift)));
-}
-
-uint32_t fmix(uint32_t h){
- h ^= h >> 16;
- h *= 0x85ebca6b;
- h ^= h >> 13;
- h *= 0xc2b2ae35;
- h ^= h >> 16;
- return h;
-}
-
-uint32_t mur(uint32_t a, uint32_t h) {
- a *= c1;
- a = rot32(a, 17);
- a *= c2;
- h ^= a;
- h = rot32(h, 19);
- return h * 5 + 0xe6546b64;
-}
-
-uint32_t hash32len0to4(uint8_t* in, size_t len){
- uint32_t b = 0, c = 9;
- for(int i = 0; i != len; i++){
- b = b * c1 + (uint32_t)in[i];
- c ^= b;
- }
- return fmix(mur(b, mur((uint32_t)len, c)));
-}
-
-uint32_t UNALIGNED_LOAD32(uint8_t *p) {
- return *(uint32_t*)p;
- /* original google code:p
- uint32_t result;
- memcpy(&result, p, sizeof(result));
- return result;
- */
-}
-
-uint32_t hash32len5to12(uint8_t* in, size_t len){
- uint32_t a = (uint32_t)(len), b = a * 5, c = 9, d = b;
- a += UNALIGNED_LOAD32(in);
- b += UNALIGNED_LOAD32(in + len - 4);
- c += UNALIGNED_LOAD32(in + ((len >> 1) & 4));
- return fmix(mur(c, mur(b, mur(a, d))));
-}
-
-uint32_t hash32len13to24(uint8_t* in, size_t len){
- uint32_t a = UNALIGNED_LOAD32(in - 4 + (len >> 1));
- uint32_t b = UNALIGNED_LOAD32(in + 4);
- uint32_t c = UNALIGNED_LOAD32(in + len - 8);
- uint32_t d = UNALIGNED_LOAD32(in + (len >> 1));
- uint32_t e = UNALIGNED_LOAD32(in);
- uint32_t f = UNALIGNED_LOAD32(in + len - 4);
- uint32_t h = (uint32_t)len;
-
- return fmix(mur(f, mur(e, mur(d, mur(c, mur(b, mur(a, h)))))));
-}
-
-uint32_t cityhash32(uint8_t* in, size_t len){
- if(len <= 24){
- if(len <= 12){
- if(len <= 4) return hash32len0to4(in, len);
- else return hash32len5to12(in, len);
- }else return hash32len13to24(in, len);
- }
-
- uint32_t h = (uint32_t)len, g = c1 * h, f = g;
- uint32_t a0 = rot32(UNALIGNED_LOAD32(in + len - 4) * c1, 17) * c2;
- uint32_t a1 = rot32(UNALIGNED_LOAD32(in + len - 8) * c1, 17) * c2;
- uint32_t a2 = rot32(UNALIGNED_LOAD32(in + len - 16) * c1, 17) * c2;
- uint32_t a3 = rot32(UNALIGNED_LOAD32(in + len - 12) * c1, 17) * c2;
- uint32_t a4 = rot32(UNALIGNED_LOAD32(in + len - 20) * c1, 17) * c2;
- h ^= a0;
- h = rot32(h, 19);
- h = h * 5 + 0xe6546b64;
- h ^= a2;
- h = rot32(h, 19);
- h = h * 5 + 0xe6546b64;
- g ^= a1;
- g = rot32(g, 19);
- g = g * 5 + 0xe6546b64;
- g ^= a3;
- g = rot32(g, 19);
- g = g * 5 + 0xe6546b64;
- f += a4;
- f = rot32(f, 19);
- f = f * 5 + 0xe6546b64;
-
- for(int i = (len - 1)/20; i != 0; i--){
- uint32_t a0 = rot32(UNALIGNED_LOAD32(in) * c1, 17) * c2;
- uint32_t a1 = UNALIGNED_LOAD32(in + 4);
- uint32_t a2 = rot32(UNALIGNED_LOAD32(in + 8) * c1, 17) * c2;
- uint32_t a3 = rot32(UNALIGNED_LOAD32(in + 12) * c1, 17) * c2;
- uint32_t a4 = UNALIGNED_LOAD32(in + 16);
- h ^= a0;
- h = rot32(h, 18);
- h = h * 5 + 0xe6546b64;
- f += a1;
- f = rot32(f, 19);
- f = f * c1;
- g += a2;
- g = rot32(g, 18);
- g = g * 5 + 0xe6546b64;
- h ^= a3 + a1;
- h = rot32(h, 19);
- h = h * 5 + 0xe6546b64;
- g ^= a4;
- g = __builtin_bswap32(g) * 5;
- h += a4 * 5;
- h = __builtin_bswap32(h);
- f += a0;
- //PERMUTE3(f, h, g);
- uint32_t temp = f;
- f = h; h = temp;
- temp = f;
- f = g; g = temp;
- //
- in += 20;
- }
-
- g = rot32(g, 11) * c1;
- g = rot32(g, 17) * c1;
- f = rot32(f, 11) * c1;
- f = rot32(f, 17) * c1;
- h = rot32(h + g, 19);
- h = h * 5 + 0xe6546b64;
- h = rot32(h, 17) * c1;
- h = rot32(h + f, 19);
- h = h * 5 + 0xe6546b64;
- h = rot32(h, 17) * c1;
-
- return h;
-}
-
-//64 version
-
-uint64_t UNALIGNED_LOAD64(uint8_t *p) {
- return *(uint64_t*)p;
- /*
- uint64_t result;
- memcpy(&result, p, sizeof(result));
- return result;
- //*/
-}
-
-uint64_t rot64(uint64_t val, int shift) {
- return ((val >> shift) | (val << (64 - shift)));
-}
-
-uint64_t hashlen16(uint64_t u, uint64_t v, uint64_t mul) {
- uint64_t a = (u ^ v) * mul;
- a ^= (a >> 47);
- uint64_t b = (v ^ a) * mul;
- b ^= (b >> 47);
- b *= mul;
- return b;
-}
-
-uint64_t shiftmix(uint64_t val) {
- return val ^ (val >> 47);
-}
-
-uint64_t hashlen0to16(uint8_t* in, size_t len){
- if(len >= 8){
- uint64_t mul = k2 + len * 2;
- uint64_t a = UNALIGNED_LOAD64(in) + k2;
- uint64_t b = UNALIGNED_LOAD64(in + len - 8);
- uint64_t c = rot64(b, 37) * mul + a;
- uint64_t d = (rot64(a, 25) + b) * mul;
- return hashlen16(c, d, mul);
- }
- if(len >= 4){
- uint64_t mul = k2 + len * 2;
- uint64_t a = UNALIGNED_LOAD32(in);
- return hashlen16(len + (a << 3), UNALIGNED_LOAD32(in + len - 4), mul);
- }
- if(len > 0){
- uint8_t a = (uint8_t)in[0];
- uint8_t b = (uint8_t)in[len >> 1];
- uint8_t c = (uint8_t)in[len - 1];
- uint32_t y = ((uint32_t)a) + (((uint32_t)b) << 8);
- uint32_t z = ((uint32_t)len) + ((uint32_t)(c) << 2);
- return shiftmix(y * k2 ^ z * k0) * k2;
- }
- return k2;
-}
-uint64_t hashlen17to32(uint8_t* in, size_t len){
- uint64_t mul = k2 + len * 2;
- uint64_t a = UNALIGNED_LOAD64(in) * k1;
- uint64_t b = UNALIGNED_LOAD64(in + 8);
- uint64_t c = UNALIGNED_LOAD64(in + len - 8) * mul;
- uint64_t d = UNALIGNED_LOAD64(in + len - 16) * k2;
- return hashlen16(rot64(a + b, 43) + rot64(c, 30) + d,
- a + rot64(b + k2, 18) + c, mul);
-}
-
-uint64_t hashlen33to64(uint8_t* in, size_t len){
- uint64_t mul = k2 + len * 2;
- uint64_t a = UNALIGNED_LOAD64(in) * k2;
- uint64_t b = UNALIGNED_LOAD64(in + 8);
- uint64_t c = UNALIGNED_LOAD64(in + len - 24);
- uint64_t d = UNALIGNED_LOAD64(in + len - 32);
- uint64_t e = UNALIGNED_LOAD64(in + 16) * k2;
- uint64_t f = UNALIGNED_LOAD64(in + 24) * 9;
- uint64_t g = UNALIGNED_LOAD64(in + len - 8);
- uint64_t h = UNALIGNED_LOAD64(in + len - 16) * mul;
- uint64_t u = rot64(a + g, 43) + (rot64(b, 30) + c) * 9;
- uint64_t v = ((a + g) ^ d) + f + 1;
- uint64_t w = __builtin_bswap64((u + v) * mul) + h;
- uint64_t x = rot64(e + f, 42) + c;
- uint64_t y = (__builtin_bswap64((v + w) * mul) + g) * mul;
- uint64_t z = e + f + c;
- a = __builtin_bswap64((x + z) * mul + y) + b;
- b = shiftmix((z + a) * mul + d + h) * mul;
- return b + x;
-}
-
-void WeakHashLen32WithSeeds(uint64_t w, uint64_t x, uint64_t y, uint64_t z, uint64_t a, uint64_t b, uint64_t*p1, int64_t*p2) {
- a += w;
- b = rot64(b + a + z, 21);
- uint64_t c = a;
- a += x;
- a += y;
- b += rot64(a, 44);
- *p1 = a + z;
- *p2 = b + c;
- //return make_pair(a + z, b + c);
-}
-
-void pWeakHashLen32WithSeeds(uint8_t* s, uint64_t a, uint64_t b, uint64_t* p1, int64_t* p2) {
- WeakHashLen32WithSeeds(UNALIGNED_LOAD64(s), UNALIGNED_LOAD64(s + 8),
- UNALIGNED_LOAD64(s + 16), UNALIGNED_LOAD64(s + 24), a, b, p1, p2);
-}
-
-uint64_t hash128to64(uint64_t f, uint64_t s) {
- uint64_t kMul = 0x9ddfea08eb382d69ULL;
- uint64_t a = (f ^ s) * kMul;
- a ^= (a >> 47);
- uint64_t b = (s ^ a) * kMul;
- b ^= (b >> 47);
- b *= kMul;
- return b;
-}
-
-uint64_t HashLen16_2(uint64_t u, uint64_t v) {
- return hash128to64(u, v);
-}
-
-uint64_t cityhash64(uint8_t* in, size_t len){
- if(len <= 32){
- if(len <= 16) return hashlen0to16(in, len);
- else return hashlen17to32(in, len);
- } else if(len <= 64) return hashlen33to64(in, len);
-
- uint64_t x = UNALIGNED_LOAD64(in + len - 40);
- uint64_t y = UNALIGNED_LOAD64(in + len - 16) + UNALIGNED_LOAD64(in + len - 56);
- uint64_t z = HashLen16_2(UNALIGNED_LOAD64(in + len - 48) + len, UNALIGNED_LOAD64(in + len - 24));
- uint64_t v1, w1;
- int64_t v2, w2;
- pWeakHashLen32WithSeeds(in + len - 64, len, z, &v1, &v2);
- pWeakHashLen32WithSeeds(in + len - 32, y + k1, x, &w1, &w2);
- x = x * k1 + UNALIGNED_LOAD64(in);
-
- for(int i = (len - 1) /64; i != 0; i--){
- x = rot64(x + y + v1 + UNALIGNED_LOAD64(in + 8), 37) * k1;
- y = rot64(y + v2 + UNALIGNED_LOAD64(in + 48), 42) * k1;
- x ^= w2;
- y += v1 + UNALIGNED_LOAD64(in + 40);
- z = rot64(z + w1, 33) * k1;
- pWeakHashLen32WithSeeds(in, v2 * k1, x + w1, &v1, &v2);
- pWeakHashLen32WithSeeds(in + 32, z + w2, y + UNALIGNED_LOAD64(in + 16), &w1, &w2);
- //std::swap(z, x);
- uint64_t temp = z;
- z = x;
- x = temp;
- in += 64;
- }
- //printf("%llu %llu %llu\n",x,y,z);
- return HashLen16_2(HashLen16_2(v1, w1) + shiftmix(y) * k1 + z,
- HashLen16_2(v2, w2) + x);
-}
-
-void citymurmur(uint8_t* in, size_t len, uint64_t f, uint64_t s, uint64_t* o1, uint64_t* o2){
- uint64_t a = f;
- uint64_t b = s;
- uint64_t c = 0;
- uint64_t d = 0;
-
- if (len <= 16) {
- a = shiftmix(a * k1) * k1;
- c = b * k1 + hashlen0to16(in, len);
- d = shiftmix(a + (len >= 8 ? UNALIGNED_LOAD64(in) : c));
- } else {
- c = HashLen16_2(UNALIGNED_LOAD64(in + len - 8) + k1, a);
- d = HashLen16_2(b + len, c + UNALIGNED_LOAD64(in + len - 16));
- a += d;
-
- for(; len > 16; len -=16) {
- a ^= shiftmix(UNALIGNED_LOAD64(in) * k1) * k1;
- a *= k1;
- b ^= a;
- c ^= shiftmix(UNALIGNED_LOAD64(in + 8) * k1) * k1;
- c *= k1;
- d ^= c;
- s += 16;
- len -= 16;
- }
- }
- a = HashLen16_2(a, c);
- b = HashLen16_2(d, b);
- //return uint128(a ^ b, HashLen16(b, a));
- *o2 = a ^ b;
- *o1 = HashLen16_2(b, a);
-}
-
-void cityhash128withseed(uint8_t* in, size_t len, uint64_t f, uint64_t s, uint64_t* o1, uint64_t* o2){
- if(len < 128){
- citymurmur(in, len, k0, k1, o2, o1);
- return;
- }
-
- uint64_t v1, w1;
- int64_t v2, w2;
- uint64_t x = f;
- uint64_t y = s;
- uint64_t z = len * k1;
-
- v1 = rot64(y ^ k1, 49) * k1 + UNALIGNED_LOAD64(in);
- v2 = rot64(v1, 42) * k1 + UNALIGNED_LOAD64(in + 8);
- w1 = rot64(y + z, 35) * k1 + x;
- w2 = rot64(x + UNALIGNED_LOAD64(in + 88), 53) * k1;
-
- for(; len >= 128; len-=128){
- x = rot64(x + y + v1 + UNALIGNED_LOAD64(in + 8), 37) * k1;
- y = rot64(y + v2 + UNALIGNED_LOAD64(in + 48), 42) * k1;
- x ^= w2;
- y += v1 + UNALIGNED_LOAD64(in + 40);
- z = rot64(z + w1, 33) * k1;
- pWeakHashLen32WithSeeds(in, v2 * k1, x + w1, &v1, &v2);
- pWeakHashLen32WithSeeds(in + 32, z + w2, y + UNALIGNED_LOAD64(in + 16), &w1, &w2);
- uint64_t temp = z;
- z = x;
- x = temp;
- in += 64;
- //
- x = rot64(x + y + v1 + UNALIGNED_LOAD64(in + 8), 37) * k1;
- y = rot64(y + v2 + UNALIGNED_LOAD64(in + 48), 42) * k1;
- x ^= w2;
- y += v1 + UNALIGNED_LOAD64(in + 40);
- z = rot64(z + w1, 33) * k1;
- pWeakHashLen32WithSeeds(in, v2 * k1, x + w1, &v1, &v2);
- pWeakHashLen32WithSeeds(in + 32, z + w2, y + UNALIGNED_LOAD64(in + 16), &w1, &w2);
- temp = z;
- z = x;
- x = temp;
- in += 64;
- }
- x += rot64(v1 + z, 49) * k0;
- y = y * k0 + rot64(w2, 37);
- z = z * k0 + rot64(w1, 27);
- w1 *= 9;
- v1 *= k0;
-
- for (size_t tail_done = 0; tail_done < len; ) {
- tail_done += 32;
- y = rot64(x + y, 42) * k0 + v2;
- w1 += UNALIGNED_LOAD64(in + len - tail_done + 16);
- x = x * k0 + w1;
- z += w2 + UNALIGNED_LOAD64(in + len - tail_done);
- w2 += v1;
- pWeakHashLen32WithSeeds(in + len - tail_done, v1 + z, v2, &v1, &v2);
- v1 *= k0;
- }
-
- x = HashLen16_2(x, v1);
- y = HashLen16_2(y + z, w1);
- //return uint128(HashLen16(x + v.second, w.second) + y,
- // HashLen16(x + w.second, y + v.second));
- *o1 = HashLen16_2(x + v2, w2) + y;
- *o2 = HashLen16_2(x + w2, y + v2);
-
-}
-
-void cityhash128(uint8_t* in, size_t len, uint64_t* f, uint64_t* s){
- if(len >= 16) return cityhash128withseed(in + 16, len - 16,UNALIGNED_LOAD64(in), UNALIGNED_LOAD64(in + 8) + k0, f, s);
- return cityhash128withseed(in, len, k0, k1, f, s);
-}
-
-int l_cityhash32(lua_State* L){
- size_t len = 0;
- uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len);
-
- char digest[32];
-
- uint32_t u = cityhash32(a, len);
- sprintf(digest,"%08x",u);
- lua_pushstring(L, digest);
- return 1;
-}
-
-int l_cityhash64(lua_State* L){
- size_t len = 0;
- uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len);
-
- char digest[64];
-
- uint64_t u = cityhash64(a, len);
- sprintf(digest,"%016"PRIx64,u);
- lua_pushstring(L, digest);
- return 1;
-}
-
-int l_cityhash128(lua_State* L){
- size_t len = 0;
- uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len);
-
- char digest[128];
-
- uint64_t u1, u2;
- cityhash128(a, len, &u1, &u2);
- sprintf(digest,"%08"PRIx64"%08"PRIx64,u1, u2);
- lua_pushstring(L, digest);
- return 1;
-}
diff --git a/src/hash/cityhash.h b/src/hash/cityhash.h deleted file mode 100644 index 77d1ff6..0000000 --- a/src/hash/cityhash.h +++ /dev/null @@ -1,40 +0,0 @@ -#include "../lua.h" -#include <stdint.h> - -static const uint32_t c1 = 0xcc9e2d51; -static const uint32_t c2 = 0x1b873593; - -uint32_t rot32(uint32_t val, int shift); -uint32_t fmix(uint32_t h); -uint32_t mur(uint32_t a, uint32_t h); -uint32_t hash32len0to4(uint8_t* in, size_t len); -uint32_t UNALIGNED_LOAD32(uint8_t *p); -uint32_t hash32len5to12(uint8_t* in, size_t len); -uint32_t hash32len13to24(uint8_t* in, size_t len); -uint32_t cityhash32(uint8_t* in, size_t len); - -//64 version - -static const uint64_t k0 = 0xc3a5c85c97cb3127ULL; -static const uint64_t k1 = 0xb492b66fbe98f273ULL; -static const uint64_t k2 = 0x9ae16a3b2f90404fULL; - -uint64_t UNALIGNED_LOAD64(uint8_t *p); -uint64_t rot64(uint64_t val, int shift); -uint64_t hashlen16(uint64_t u, uint64_t v, uint64_t mul); -uint64_t shiftmix(uint64_t val); -uint64_t hashlen0to16(uint8_t* in, size_t len); -uint64_t hashlen17to32(uint8_t* in, size_t len); -uint64_t hashlen33to64(uint8_t* in, size_t len); -void WeakHashLen32WithSeeds(uint64_t w, uint64_t x, uint64_t y, uint64_t z, uint64_t a, uint64_t b, uint64_t*p1, int64_t*p2); -void pWeakHashLen32WithSeeds(uint8_t* s, uint64_t a, uint64_t b, uint64_t* p1, int64_t* p2); -uint64_t hash128to64(uint64_t f, uint64_t s); -uint64_t HashLen16_2(uint64_t u, uint64_t v); -uint64_t cityhash64(uint8_t* in, size_t len); -void citymurmur(uint8_t* in, size_t len, uint64_t f, uint64_t s, uint64_t* o1, uint64_t* o2); -void cityhash128withseed(uint8_t* in, size_t len, uint64_t f, uint64_t s, uint64_t* o1, uint64_t* o2); -void cityhash128(uint8_t* in, size_t len, uint64_t* f, uint64_t* s); - -int l_cityhash32(lua_State*); -int l_cityhash64(lua_State*); -int l_cityhash128(lua_State*); diff --git a/src/hash/farmhash.c b/src/hash/farmhash.c deleted file mode 100644 index 3db7ef4..0000000 --- a/src/hash/farmhash.c +++ /dev/null @@ -1,168 +0,0 @@ -#include "../crypto.h" //include city hash too
-#include <stdint.h>
-#include <inttypes.h>
-uint32_t farmhash32len13to24(uint8_t* in, size_t len) {
- uint32_t seed = 0;
- uint32_t a = UNALIGNED_LOAD32(in - 4 + (len >> 1));
- uint32_t b = UNALIGNED_LOAD32(in + 4);
- uint32_t c = UNALIGNED_LOAD32(in + len - 8);
- uint32_t d = UNALIGNED_LOAD32(in + (len >> 1));
- uint32_t e = UNALIGNED_LOAD32(in);
- uint32_t f = UNALIGNED_LOAD32(in + len - 4);
- uint32_t h = d * c1 + len + seed;
- a = rot32(a, 12) + f;
- h = mur(c, h) + a;
- a = rot32(a, 3) + c;
- h = mur(e, h) + a;
- a = rot32(a + f, 12) + d;
- h = mur(b ^ seed, h) + a;
- return fmix(h);
-}
-
-uint32_t farmhash32(uint8_t* in, size_t len){
- if(len <= 24){
- if(len <= 12){
- if(len <= 4) return hash32len0to4(in, len);
- else return hash32len5to12(in, len);
- } else return farmhash32len13to24(in, len);
- }
-
- uint32_t h = len, g = c1 * len, f = g;
- uint32_t a0 = rot32(UNALIGNED_LOAD32(in + len - 4) * c1, 17) * c2;
- uint32_t a1 = rot32(UNALIGNED_LOAD32(in + len - 8) * c1, 17) * c2;
- uint32_t a2 = rot32(UNALIGNED_LOAD32(in + len - 16) * c1, 17) * c2;
- uint32_t a3 = rot32(UNALIGNED_LOAD32(in + len - 12) * c1, 17) * c2;
- uint32_t a4 = rot32(UNALIGNED_LOAD32(in + len - 20) * c1, 17) * c2;
-
- h ^= a0;
- h = rot32(h, 19);
- h = h * 5 + 0xe6546b64;
- h ^= a2;
- h = rot32(h, 19);
- h = h * 5 + 0xe6546b64;
- g ^= a1;
- g = rot32(g, 19);
- g = g * 5 + 0xe6546b64;
- g ^= a3;
- g = rot32(g, 19);
- g = g * 5 + 0xe6546b64;
- f += a4;
- f = rot32(f, 19) + 113;
- size_t iters = (len - 1) / 20;
- for(int i = (len - 1) / 20; i != 0; i--){
- uint32_t a = UNALIGNED_LOAD32(in);
- uint32_t b = UNALIGNED_LOAD32(in + 4);
- uint32_t c = UNALIGNED_LOAD32(in + 8);
- uint32_t d = UNALIGNED_LOAD32(in + 12);
- uint32_t e = UNALIGNED_LOAD32(in + 16);
- h += a;
- g += b;
- f += c;
- h = mur(d, h) + e;
- g = mur(c, g) + a;
- f = mur(b + e * c1, f) + d;
- f += g;
- g += f;
- in += 20;
- }
- g = rot32(g, 11) * c1;
- g = rot32(g, 17) * c1;
- f = rot32(f, 11) * c1;
- f = rot32(f, 17) * c1;
- h = rot32(h + g, 19);
- h = h * 5 + 0xe6546b64;
- h = rot32(h, 17) * c1;
- h = rot32(h + f, 19);
- h = h * 5 + 0xe6546b64;
- h = rot32(h, 17) * c1;
- return h;
-}
-
-uint64_t farmhashlen33to64(uint8_t *s, size_t len) {
- uint64_t mul = k2 + len * 2;
- uint64_t a = UNALIGNED_LOAD64(s) * k2;
- uint64_t b = UNALIGNED_LOAD64(s + 8);
- uint64_t c = UNALIGNED_LOAD64(s + len - 8) * mul;
- uint64_t d = UNALIGNED_LOAD64(s + len - 16) * k2;
- uint64_t y = rot64(a + b, 43) + rot64(c, 30) + d;
- uint64_t z = hashlen16(y, a + rot64(b + k2, 18) + c, mul);
- uint64_t e = UNALIGNED_LOAD64(s + 16) * mul;
- uint64_t f = UNALIGNED_LOAD64(s + 24);
- uint64_t g = (y + UNALIGNED_LOAD64(s + len - 32)) * mul;
- uint64_t h = (z + UNALIGNED_LOAD64(s + len - 24)) * mul;
- return hashlen16(rot64(e + f, 43) + rot64(g, 30) + h,
- e + rot64(f + a, 18) + g, mul);
-}
-
-uint64_t farmhash64(uint8_t* in, size_t len){
- if(len <= 32){
- if(len <= 16) return hashlen0to16(in, len);
- else return hashlen17to32(in, len);
- } else if(len <= 64) return farmhashlen33to64(in, len);
-
- uint64_t seed = 81;
- uint64_t x = seed;
- uint64_t y = seed * k1 + 113;
- uint64_t z = shiftmix(y * k2 + 113) * k2;
-
- uint64_t v1 = 0, w1 = 0;
- int64_t v2 = 0, w2 = 0;
- x = x * k2 + UNALIGNED_LOAD64(in);
- uint8_t* end = in + ((len - 1) / 64) * 64;
- uint8_t* last64 = end + ((len - 1) & 63) - 63;
- //assert(in + len - 64 == last64);
- for(; in != end; in += 64) {
- x = rot64(x + y + v1 + UNALIGNED_LOAD64(in + 8), 37) * k1;
- y = rot64(y + v2 + UNALIGNED_LOAD64(in + 48), 42) * k1;
- x ^= w2;
- y += v1 + UNALIGNED_LOAD64(in + 40);
- z = rot64(z + w1, 33) * k1;
- pWeakHashLen32WithSeeds(in, v2 * k1, x + w1, &v1, &v2);
- pWeakHashLen32WithSeeds(in + 32, z + w2, y + UNALIGNED_LOAD64(in + 16), &w1, &w2);
- uint64_t temp = z;
- z = x; x = temp;
- }
- uint64_t mul = k1 + ((z & 0xff) << 1);
-
- in = last64;
- w1 += ((len - 1) & 63);
- v1 += w1;
- w1 += v1;
- x = rot64(x + y + v1 + UNALIGNED_LOAD64(in + 8), 37) * mul;
- y = rot64(y + v2 + UNALIGNED_LOAD64(in + 48), 42) * mul;
- x ^= w2 * 9;
- y += v1 * 9 + UNALIGNED_LOAD64(in + 40);
- z = rot64(z + w1, 33) * mul;
- pWeakHashLen32WithSeeds(in, v2 * mul, x + w1, &v1, &v2);
- pWeakHashLen32WithSeeds(in + 32, z + w2, y + UNALIGNED_LOAD64(in + 16), &w1, &w2);
- uint64_t temp = z;
- z = x; x = temp;
- return hashlen16(hashlen16(v1, w1, mul) + shiftmix(y) * k0 + z,
- hashlen16(v2, w2, mul) + x,
- mul);
- return 1;
-}
-
-int l_farmhash32(lua_State* L){
- size_t len = 0;
- uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len);
-
- char digest[32];
-
- uint32_t u = farmhash32(a, len);
- sprintf(digest,"%04"PRIx32,u);
- lua_pushstring(L, digest);
- return 1;
-}
-
-int l_farmhash64(lua_State* L){
- size_t len = 0;
- uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len);
-
- char digest[64];
-
- uint64_t u = farmhash64(a, len);
- sprintf(digest,"%016"PRIx64,u);
- lua_pushstring(L, digest);
- return 1;
-}
diff --git a/src/hash/farmhash.h b/src/hash/farmhash.h deleted file mode 100644 index 97c0813..0000000 --- a/src/hash/farmhash.h +++ /dev/null @@ -1,8 +0,0 @@ -#include "../lua.h" -#include <stdint.h> - -uint32_t farmhash32(uint8_t* in, size_t len); -uint64_t farmhash64(uint8_t* in, size_t len); - -int l_farmhash32(lua_State*); -int l_farmhash64(lua_State*); diff --git a/src/hash/metrohash.c b/src/hash/metrohash.c deleted file mode 100644 index 080091b..0000000 --- a/src/hash/metrohash.c +++ /dev/null @@ -1,222 +0,0 @@ -#include "../crypto.h"
-#include <inttypes.h>
-#include <stdint.h>
-
-#define u64(a) (*(uint64_t*)a)
-#define u32(a) (*(uint32_t*)a)
-#define u16(a) (*(uint16_t*)a)
-#define u8(a) (*(uint8_t*)a)
-
-uint64_t metrohash64(uint8_t* in, size_t len, uint32_t seed, enum metrohash_version v){
- uint64_t k0, k1, k2, k3, inner_r, inner_r2;
- if(v == v1){
- k0 = 0xC83A91E1;
- k1 = 0x8648DBDB;
- k2 = 0x7BDEC03B;
- k3 = 0x2F5870A5;
- inner_r = 33;
- inner_r2 = 33;
- } else {
- k0 = 0xD6D018F5;
- k1 = 0xA2AA033B;
- k2 = 0x62992FC1;
- k3 = 0x30BC5B29;
- inner_r = 30;
- inner_r2 = 29;
- }
-
- uint8_t* end = in + len;
- uint64_t hash = ((((uint64_t)seed) + k2) * k0) + len;
-
- if(len >= 32){
- uint64_t v[4];
- v[0] = hash;
- v[1] = hash;
- v[2] = hash;
- v[3] = hash;
-
- for(; in <= (end - 32);){
- v[0] += u64(in) * k0; in += 8; v[0] = rot64(v[0],29) + v[2];
- v[1] += u64(in) * k1; in += 8; v[1] = rot64(v[1],29) + v[3];
- v[2] += u64(in) * k2; in += 8; v[2] = rot64(v[2],29) + v[0];
- v[3] += u64(in) * k3; in += 8; v[3] = rot64(v[3],29) + v[1];
- }
-
- v[2] ^= rot64(((v[0] + v[3]) * k0) + v[1], inner_r) * k1;
- v[3] ^= rot64(((v[1] + v[2]) * k1) + v[0], inner_r) * k0;
- v[0] ^= rot64(((v[0] + v[2]) * k0) + v[3], inner_r) * k1;
- v[1] ^= rot64(((v[1] + v[3]) * k1) + v[2], inner_r) * k0;
- hash += v[0] ^ v[1];
- }
-
- if ((end - in) >= 16){
- uint64_t v0 = hash + (u64(in) * (v == v1? k0 : k2)); in += 8; v0 = rot64(v0,inner_r2) * (v == v1? k1 : k3);
- uint64_t v1 = hash + (u64(in) * (v == v1? k1 : k2)); in += 8; v1 = rot64(v1,inner_r2) * (v == v1? k2 : k3);
- v0 ^= rot64(v0 * k0, (v == v1? 35 : 34)) + v1;
- v1 ^= rot64(v1 * k3, (v == v1? 35 : 34)) + v0;
- hash += v1;
- }
-
- if ((end - in) >= 8){
- hash += u64(in) * k3; in += 8;
- hash ^= rot64(hash, (v == v1? 33 : 36)) * k1;
-
- }
-
- if ((end - in) >= 4){
- hash += u32(in) * k3; in += 4;
- hash ^= rot64(hash, 15) * k1;
- }
-
- if ((end - in) >= 2){
- hash += u16(in) * k3; in += 2;
- hash ^= rot64(hash, (v == v1? 13 : 15)) * k1;
- }
-
- if ((end - in) >= 1){
- hash += u8(in) * k3;
- hash ^= rot64(hash, (v == v1? 25 : 23)) * k1;
- }
-
- hash ^= rot64(hash, (v == v1? 33 : 28));
- hash *= k0;
- hash ^= rot64(hash, (v == v1? 33 : 29));
-
- return hash;
-}
-
-void metrohash128(uint8_t* in, size_t len, uint32_t seed, uint64_t *a, uint64_t *b, enum metrohash_version ver){
- uint64_t k0 = 0xC83A91E1;
- uint64_t k1 = 0x8648DBDB;
- uint64_t k2 = 0x7BDEC03B;
- uint64_t k3 = 0x2F5870A5;
-
- if(ver == v2){
- k0 = 0xD6D018F5;
- k1 = 0xA2AA033B;
- k2 = 0x62992FC1;
- k3 = 0x30BC5B29;
- }
-
- uint8_t * end = in + len;
-
- uint64_t v[4];
-
- v[0] = ((((uint64_t)seed) - k0) * k3) + len;
- v[1] = ((((uint64_t)seed) + k1) * k2) + len;
-
- if(len >= 32){
- v[2] = ((((uint64_t)seed) + k0) * k2) + len;
- v[3] = ((((uint64_t)seed) - k1) * k3) + len;
-
- for(;in <= end - 32;){
- v[0] += u64(in) * k0; in += 8; v[0] = rot64(v[0],29) + v[2];
- v[1] += u64(in) * k1; in += 8; v[1] = rot64(v[1],29) + v[3];
- v[2] += u64(in) * k2; in += 8; v[2] = rot64(v[2],29) + v[0];
- v[3] += u64(in) * k3; in += 8; v[3] = rot64(v[3],29) + v[1];
- }
-
- v[2] ^= rot64(((v[0] + v[3]) * k0) + v[1], ver == v1 ? 26 : 33) * k1;
- v[3] ^= rot64(((v[1] + v[2]) * k1) + v[0], ver == v1 ? 26 : 33) * k0;
- v[0] ^= rot64(((v[0] + v[2]) * k0) + v[3], ver == v1 ? 26 : 33) * k1;
- v[1] ^= rot64(((v[1] + v[3]) * k1) + v[2], ver == v1 ? 26 : 33) * k0;
- }
-
- if ((end - in) >= 16){
- v[0] += u64(in) * k2; in += 8; v[0] = rot64(v[0],ver == v1 ? 33 : 29) * k3;
- v[1] += u64(in) * k2; in += 8; v[1] = rot64(v[1],ver == v1 ? 33 : 29) * k3;
- v[0] ^= rot64((v[0] * k2) + v[1], ver == v1 ? 17 : 29) * k1;
- v[1] ^= rot64((v[1] * k3) + v[0], ver == v1 ? 17 : 29) * k0;
- }
-
- if ((end - in) >= 8){
- v[0] += u64(in) * k2; in += 8; v[0] = rot64(v[0],ver == v1 ? 33 : 29) * k3;
- v[0] ^= rot64((v[0] * k2) + v[1], ver == v1 ? 20 : 29) * k1;
- }
-
- if ((end - in) >= 4){
- v[1] += u32(in) * k2; in += 4; v[1] = rot64(v[1],ver == v1 ? 33 : 29) * k3;
- v[1] ^= rot64((v[1] * k3) + v[0], ver == v1 ? 18 : 25) * k0;
- }
-
- if ((end - in) >= 2){
- v[0] += u16(in) * k2; in += 2; v[0] = rot64(v[0],ver == v1 ? 33 : 29) * k3;
- v[0] ^= rot64((v[0] * k2) + v[1], ver == v1 ? 24 : 30) * k1;
- }
-
- if ((end - in) >= 1){
- v[1] += u8(in) * k2; v[1] = rot64(v[1],ver == v1 ? 33 : 29) * k3;
- v[1] ^= rot64((v[1] * k3) + v[0], ver == v1 ? 24 : 18) * k0;
- }
-
- v[0] += rot64((v[0] * k0) + v[1], ver == v1 ? 13 : 33);
- v[1] += rot64((v[1] * k1) + v[0], ver == v1 ? 37 : 33);
- v[0] += rot64((v[0] * k2) + v[1], ver == v1 ? 13 : 33);
- v[1] += rot64((v[1] * k3) + v[0], ver == v1 ? 37 : 33);
-
- //printf("%llx %llx",v[0],v[1]);
- *a = v[0];
- *b = v[1];
-}
-
-int l_metrohash64_v1(lua_State* L){
- size_t len = 0;
- uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len);
- int argv = lua_gettop(L);
- uint64_t seed = 0;
- if(argv > 1) seed = luaL_checkinteger(L, 2);
-
- char digest[64];
-
- uint64_t u = metrohash64(a, len, seed, v1);
- sprintf(digest,"%016"PRIx64,u);
- lua_pushstring(L, digest);
- return 1;
-}
-
-int l_metrohash64_v2(lua_State* L){
- size_t len = 0;
- uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len);
- int argv = lua_gettop(L);
- uint64_t seed = 0;
- if(argv > 1) seed = luaL_checkinteger(L, 2);
-
- char digest[64];
-
- uint64_t u = metrohash64(a, len, seed, v2);
- sprintf(digest,"%016"PRIx64,u);
- lua_pushstring(L, digest);
- return 1;
-}
-
-int l_metrohash128_v1(lua_State* L){
- size_t len = 0;
- uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len);
- int argv = lua_gettop(L);
- uint64_t seed = 0;
- if(argv > 1) seed = luaL_checkinteger(L, 2);
-
- char digest[64];
-
- uint64_t u1, u2;
- metrohash128(a, len, seed, &u1, &u2, v1);
- sprintf(digest,"%016"PRIx64"%016"PRIx64,u1,u2);
- lua_pushstring(L, digest);
- return 1;
-}
-
-int l_metrohash128_v2(lua_State* L){
- size_t len = 0;
- uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len);
- int argv = lua_gettop(L);
- uint64_t seed = 0;
- if(argv > 1) seed = luaL_checkinteger(L, 2);
-
- char digest[64];
-
- uint64_t u1, u2;
- metrohash128(a, len, seed, &u1, &u2, v2);
- sprintf(digest,"%016"PRIx64"%016"PRIx64,u1,u2);
- lua_pushstring(L, digest);
- return 1;
-}
diff --git a/src/hash/metrohash.h b/src/hash/metrohash.h deleted file mode 100644 index 8c9ebea..0000000 --- a/src/hash/metrohash.h +++ /dev/null @@ -1,14 +0,0 @@ -#include "../lua.h" -#include <stdint.h> - -enum metrohash_version { - v1, v2 -}; - -uint64_t metrohash64(uint8_t* in, size_t len, uint32_t seed, enum metrohash_version v); -void metrohash128(uint8_t* in, size_t len, uint32_t seed, uint64_t *a, uint64_t *b, enum metrohash_version ver); - -int l_metrohash64_v1(lua_State*); -int l_metrohash64_v2(lua_State*); -int l_metrohash128_v1(lua_State*); -int l_metrohash128_v2(lua_State*); diff --git a/src/hash/spookyhash.c b/src/hash/spookyhash.c deleted file mode 100644 index 1ad3003..0000000 --- a/src/hash/spookyhash.c +++ /dev/null @@ -1,330 +0,0 @@ -#include "../crypto.h" -#include <stdint.h> -#include <string.h> - -static const int sc_numVars = 12; -static const uint64_t sc_const = 0xdeadbeefdeadbeefLL; -static const size_t sc_blockSize = sc_numVars*8; -static const size_t sc_bufSize = 2*sc_blockSize; - -uint64_t i_rot64(uint64_t x, int k){ - return (x << k) | (x >> (64 - k)); -} - -void short_mix(uint64_t* h0, uint64_t* h1, uint64_t* h2, uint64_t* h3){ - *h2 = i_rot64(*h2,50); *h2 += *h3; *h0 ^= *h2; - *h3 = i_rot64(*h3,52); *h3 += *h0; *h1 ^= *h3; - *h0 = i_rot64(*h0,30); *h0 += *h1; *h2 ^= *h0; - *h1 = i_rot64(*h1,41); *h1 += *h2; *h3 ^= *h1; - *h2 = i_rot64(*h2,54); *h2 += *h3; *h0 ^= *h2; - *h3 = i_rot64(*h3,48); *h3 += *h0; *h1 ^= *h3; - *h0 = i_rot64(*h0,38); *h0 += *h1; *h2 ^= *h0; - *h1 = i_rot64(*h1,37); *h1 += *h2; *h3 ^= *h1; - *h2 = i_rot64(*h2,62); *h2 += *h3; *h0 ^= *h2; - *h3 = i_rot64(*h3,34); *h3 += *h0; *h1 ^= *h3; - *h0 = i_rot64(*h0,5); *h0 += *h1; *h2 ^= *h0; - *h1 = i_rot64(*h1,36); *h1 += *h2; *h3 ^= *h1; -} - -void short_end(uint64_t* h0, uint64_t* h1, uint64_t* h2, uint64_t* h3){ - *h3 ^= *h2; *h2 = i_rot64(*h2,15); *h3 += *h2; - *h0 ^= *h3; *h3 = i_rot64(*h3,52); *h0 += *h3; - *h1 ^= *h0; *h0 = i_rot64(*h0,26); *h1 += *h0; - *h2 ^= *h1; *h1 = i_rot64(*h1,51); *h2 += *h1; - *h3 ^= *h2; *h2 = i_rot64(*h2,28); *h3 += *h2; - *h0 ^= *h3; *h3 = i_rot64(*h3,9); *h0 += *h3; - *h1 ^= *h0; *h0 = i_rot64(*h0,47); *h1 += *h0; - *h2 ^= *h1; *h1 = i_rot64(*h1,54); *h2 += *h1; - *h3 ^= *h2; *h2 = i_rot64(*h2,32); *h3 += *h2; - *h0 ^= *h3; *h3 = i_rot64(*h3,25); *h0 += *h3; - *h1 ^= *h0; *h0 = i_rot64(*h0,63); *h1 += *h0; -} -void spooky_short(uint8_t* in, size_t len, uint64_t* hash1, uint64_t* hash2, enum spooky_version v){ - uint64_t buffer[2*sc_numVars]; - union { - const uint8_t *p8; - uint32_t *p32; - uint64_t *p64; - size_t i; - } u; - - u.p8 = (const uint8_t*)in; - - size_t remainder = len%32; - uint64_t a=*hash1; - uint64_t b=*hash2; - uint64_t c=sc_const; - uint64_t d=sc_const; - - if(len > 12){ - const uint64_t *end = u.p64 + (len/32)*4; - - for(; u.p64 < end; u.p64 += 4){ - c += u.p64[0]; - d += u.p64[1]; - short_mix(&a,&b,&c,&d); - a += u.p64[2]; - b += u.p64[3]; - } - - if(remainder >= 16){ - c += u.p64[0]; - d += u.p64[1]; - short_mix(&a,&b,&c,&d); - u.p64 += 2; - remainder -= 16; - } - } - - d = (((uint64_t)len) << 56) + (d * (v == spv2)); - switch(remainder){ - case 15: - d += ((uint64_t)u.p8[14]) << 48; - case 14: - d += ((uint64_t)u.p8[13]) << 40; - case 13: - d += ((uint64_t)u.p8[12]) << 32; - case 12: - d += u.p32[2]; - c += u.p64[0]; - break; - case 11: - d += ((uint64_t)u.p8[10]) << 16; - case 10: - d += ((uint64_t)u.p8[9]) << 8; - case 9: - d += (uint64_t)u.p8[8]; - case 8: - c += u.p64[0]; - break; - case 7: - c += ((uint64_t)u.p8[6]) << 48; - case 6: - c += ((uint64_t)u.p8[5]) << 40; - case 5: - c += ((uint64_t)u.p8[4]) << 32; - case 4: - c += u.p32[0]; - break; - case 3: - c += ((uint64_t)u.p8[2]) << 16; - case 2: - c += ((uint64_t)u.p8[1]) << 8; - case 1: - c += (uint64_t)u.p8[0]; - break; - case 0: - c += sc_const; - d += sc_const; - } - short_end(&a,&b,&c,&d); - *hash1 = a; - *hash2 = b; -} - -void mix(const uint64_t *data, - uint64_t* s0, uint64_t* s1, uint64_t* s2, uint64_t* s3, - uint64_t* s4, uint64_t* s5, uint64_t* s6, uint64_t* s7, - uint64_t* s8, uint64_t* s9, uint64_t* s10,uint64_t* s11){ - *s0 += data[0]; *s2 ^= *s10; *s11 ^= *s0; *s0 = i_rot64(*s0,11); *s11 += *s1; - *s1 += data[1]; *s3 ^= *s11; *s0 ^= *s1; *s1 = i_rot64(*s1,32); *s0 += *s2; - *s2 += data[2]; *s4 ^= *s0; *s1 ^= *s2; *s2 = i_rot64(*s2,43); *s1 += *s3; - *s3 += data[3]; *s5 ^= *s1; *s2 ^= *s3; *s3 = i_rot64(*s3,31); *s2 += *s4; - *s4 += data[4]; *s6 ^= *s2; *s3 ^= *s4; *s4 = i_rot64(*s4,17); *s3 += *s5; - *s5 += data[5]; *s7 ^= *s3; *s4 ^= *s5; *s5 = i_rot64(*s5,28); *s4 += *s6; - *s6 += data[6]; *s8 ^= *s4; *s5 ^= *s6; *s6 = i_rot64(*s6,39); *s5 += *s7; - *s7 += data[7]; *s9 ^= *s5; *s6 ^= *s7; *s7 = i_rot64(*s7,57); *s6 += *s8; - *s8 += data[8]; *s10 ^= *s6; *s7 ^= *s8; *s8 = i_rot64(*s8,55); *s7 += *s9; - *s9 += data[9]; *s11 ^= *s7; *s8 ^= *s9; *s9 = i_rot64(*s9,54); *s8 += *s10; - *s10 += data[10]; *s0 ^= *s8; *s9 ^= *s10; *s10 = i_rot64(*s10,22); *s9 += *s11; - *s11 += data[11]; *s1 ^= *s9; *s10 ^= *s11; *s11 = i_rot64(*s11,46); *s10 += *s0; -} - -void end_partial( - uint64_t* h0, uint64_t* h1, uint64_t* h2, uint64_t* h3, - uint64_t* h4, uint64_t* h5, uint64_t* h6, uint64_t* h7, - uint64_t* h8, uint64_t* h9, uint64_t* h10,uint64_t* h11) - { - *h11+= *h1; *h2 ^= *h11; *h1 = i_rot64(*h1,44); - *h0 += *h2; *h3 ^= *h0; *h2 = i_rot64(*h2,15); - *h1 += *h3; *h4 ^= *h1; *h3 = i_rot64(*h3,34); - *h2 += *h4; *h5 ^= *h2; *h4 = i_rot64(*h4,21); - *h3 += *h5; *h6 ^= *h3; *h5 = i_rot64(*h5,38); - *h4 += *h6; *h7 ^= *h4; *h6 = i_rot64(*h6,33); - *h5 += *h7; *h8 ^= *h5; *h7 = i_rot64(*h7,10); - *h6 += *h8; *h9 ^= *h6; *h8 = i_rot64(*h8,13); - *h7 += *h9; *h10^= *h7; *h9 = i_rot64(*h9,38); - *h8 += *h10; *h11^= *h8; *h10= i_rot64(*h10,53); - *h9 += *h11; *h0 ^= *h9; *h11= i_rot64(*h11,42); - *h10+= *h0; *h1 ^= *h10; *h0 = i_rot64(*h0,54); -} - -void end_f(uint64_t* h0, uint64_t* h1, uint64_t* h2, uint64_t* h3, - uint64_t* h4, uint64_t* h5, uint64_t* h6, uint64_t* h7, - uint64_t* h8, uint64_t* h9, uint64_t* h10,uint64_t* h11){ - end_partial(h0,h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11); - end_partial(h0,h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11); - end_partial(h0,h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11); -} - -#define allow_unali 1 -void spookyhash128(uint8_t* in, size_t len, uint64_t* hash1, uint64_t* hash2, enum spooky_version v){ - if(len < sc_bufSize){ - spooky_short(in, len, hash1, hash2,v); - return; - } - - uint64_t h0,h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11; - uint64_t buf[sc_numVars]; - uint64_t *end; - union - { - const uint8_t *p8; - uint64_t *p64; - size_t i; - } u; - size_t remainder; - - h0=h3=h6=h9 = *hash1; - h1=h4=h7=h10 = *hash2; - h2=h5=h8=h11 = sc_const; - - u.p8 = (const uint8_t *)in; - end = u.p64 + (len/sc_blockSize)*sc_numVars; - - if(allow_unali || ((u.i & 0x7) == 0)){ - for(; u.p64 < end;){ - mix(u.p64, &h0,&h1,&h2,&h3,&h4,&h5,&h6,&h7,&h8,&h9,&h10,&h11); - u.p64 += sc_numVars; - } - } else { - //do this - - } - - remainder = (len - ((const uint8_t*)end - (const uint8_t*)in)); - memcpy(buf, end, remainder); - memset(((uint8_t*)buf)+remainder, 0, sc_blockSize - remainder); - ((uint8_t*)buf)[sc_blockSize - 1] = remainder; - - mix(buf, &h0,&h1,&h2,&h3,&h4,&h5,&h6,&h7,&h8,&h9,&h10,&h11); - end_f(&h0,&h1,&h2,&h3,&h4,&h5,&h6,&h7,&h8,&h9,&h10,&h11); - *hash1 = h0; - *hash2 = h1; - -} - -uint64_t spookyhash64(uint8_t *message, size_t length, uint64_t seed, enum spooky_version v){ - uint64_t hash1 = seed; - spookyhash128(message, length, &hash1, &seed, v); - return hash1; -} -uint32_t spookyhash32(uint8_t *message, size_t length, uint32_t seed, enum spooky_version v){ - uint64_t hash1 = seed, hash2 = seed; - spookyhash128(message, length, &hash1, &hash2, v); - return (uint32_t)hash1; -} - -int l_spookyhash128_v1(lua_State* L){ - size_t len = 0; - uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len); - int argv = lua_gettop(L); - uint64_t b = 0, c = 0; - - if(argv > 1){ - b = luaL_checkinteger(L, 2); - c = luaL_checkinteger(L, 3); - } - char digest[128] = {0}; - //uint64_t b = 0; - //uint64_t c = 0; - spookyhash128(a, 4, &b, &c, spv1); - - sprintf(digest, "%016lx%016lx", b, c); - lua_pushstring(L, digest); - return 1; -} - -int l_spookyhash128_v2(lua_State* L){ - size_t len = 0; - uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len); - int argv = lua_gettop(L); - uint64_t b = 0, c = 0; - - if(argv > 1){ - b = luaL_checkinteger(L, 2); - c = luaL_checkinteger(L, 3); - } - char digest[128] = {0}; - //uint64_t b = 0; - //uint64_t c = 0; - spookyhash128(a, 4, &b, &c, spv2); - - sprintf(digest, "%016lx%016lx", b, c); - lua_pushstring(L, digest); - return 1; -} - -int l_spookyhash64_v1(lua_State* L){ - size_t len = 0; - uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len); - int argv = lua_gettop(L); - uint64_t seed = 0; - if(argv > 1) seed = luaL_checkinteger(L, 2); - - char digest[64] = {0}; - - sprintf(digest, "%08lx", spookyhash64(a, len, seed, spv1)); - lua_pushstring(L, digest); - return 1; -} - -int l_spookyhash64_v2(lua_State* L){ - size_t len = 0; - uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len); - int argv = lua_gettop(L); - uint64_t seed = 0; - if(argv > 1) seed = luaL_checkinteger(L, 2); - - char digest[64] = {0}; - - sprintf(digest, "%08lx", spookyhash64(a, len, seed, spv2)); - lua_pushstring(L, digest); - return 1; -} - -int l_spookyhash32_v1(lua_State* L){ - size_t len = 0; - uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len); - int argv = lua_gettop(L); - uint32_t seed = 0; - if(argv > 1) seed = luaL_checkinteger(L, 2); - - char digest[32] = {0}; - - sprintf(digest, "%04x", spookyhash32(a, len, seed, spv1)); - lua_pushstring(L, digest); - return 1; -} - -int l_spookyhash32_v2(lua_State* L){ - size_t len = 0; - uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len); - int argv = lua_gettop(L); - uint32_t seed = 0; - if(argv > 1) seed = luaL_checkinteger(L, 2); - - char digest[32] = {0}; - - sprintf(digest, "%04x", spookyhash32(a, len, seed, spv2)); - lua_pushstring(L, digest); - return 1; -} -/* -int __main(){ - uint64_t a = 0; - uint64_t b = 0; - spookyhash128("meow",4,&a,&b,v2); - printf("%llx %llx %x",a,spookyhash64("meow",4,0,v2),spookyhash32("meow",4,0,v2)); - return 0; -}*/ diff --git a/src/hash/spookyhash.h b/src/hash/spookyhash.h deleted file mode 100644 index 5ca6c8a..0000000 --- a/src/hash/spookyhash.h +++ /dev/null @@ -1,17 +0,0 @@ -#include "../lua.h" -#include <stdint.h> - -enum spooky_version { - spv1, spv2 -}; - -void spookyhash128(uint8_t* in, size_t len, uint64_t* hash1, uint64_t* hash2, enum spooky_version v); -uint64_t spookyhash64(uint8_t *message, size_t length, uint64_t seed, enum spooky_version v); -uint32_t spookyhash32(uint8_t *message, size_t length, uint32_t seed, enum spooky_version v); - -int l_spookyhash128_v1(lua_State*); -int l_spookyhash128_v2(lua_State*); -int l_spookyhash64_v1(lua_State*); -int l_spookyhash64_v2(lua_State*); -int l_spookyhash32_v1(lua_State*); -int l_spookyhash32_v2(lua_State*); diff --git a/src/hash/xxh.c b/src/hash/xxh.c deleted file mode 100644 index 3fd213c..0000000 --- a/src/hash/xxh.c +++ /dev/null @@ -1,155 +0,0 @@ -#include "../crypto.h"
-#include <stdio.h>
-#include <stdint.h>
-#include <inttypes.h>
-
-#define max_buffer_size32 16
-#define max_buffer_size64 32
-static inline uint32_t rol32(uint32_t x, unsigned char bits){
- return (x << bits) | (x >> (32 - bits));
-}
-static inline uint64_t rol64(uint64_t x, unsigned char bits){
- return (x << bits) | (x >> (64 - bits));
-}
-
-uint32_t i_xxhash32(uint8_t *data, uint32_t seed, size_t len){
- const uint32_t prime1 = 2654435761U;
- const uint32_t prime2 = 2246822519U;
- const uint32_t prime3 = 3266489917U;
- const uint32_t prime4 = 668265263U;
- const uint32_t prime5 = 374761393U;
-
- uint32_t state[4];
- uint32_t result = len;
-
- uint8_t* stop = data + len;
- uint8_t* stop_block = stop - max_buffer_size32;
-
- state[0] = seed + prime1 + prime2;
- state[1] = seed + prime2;
- state[2] = seed;
- state[3] = seed - prime1;
-
- for(;data <= stop_block;){
- state[0] = rol32(state[0] + data[0] * prime2, 13) * prime1;
- state[1] = rol32(state[1] + data[1] * prime2, 13) * prime1;
- state[2] = rol32(state[2] + data[2] * prime2, 13) * prime1;
- state[3] = rol32(state[3] + data[3] * prime2, 13) * prime1;
-
- data += 16;
- }
-
- if(len >= max_buffer_size32){
- result += rol32(state[0], 1) + rol32(state[1], 7) +
- rol32(state[2], 12) + rol32(state[3], 18);
- } else result += state[2] + prime5;
-
- for (; data + 4 <= stop; data += 4)
- result = rol32(result + *(uint32_t*)data * prime3, 17) * prime4;
-
- for(;data != stop;)
- result = rol32(result + (*data++) * prime5, 11) * prime1;
-
- result ^= result >> 15;
- result *= prime2;
- result ^= result >> 13;
- result *= prime3;
- result ^= result >> 16;
-
- return result;
-}
-
-#define pr64(u1,u2) rol64((u1) + (u2) * prime2, 31) * prime1
-uint64_t i_xxhash64(uint8_t *data, uint64_t seed, uint64_t len){
- const uint64_t prime1 = 11400714785074694791ULL;
- const uint64_t prime2 = 14029467366897019727ULL;
- const uint64_t prime3 = 1609587929392839161ULL;
- const uint64_t prime4 = 9650029242287828579ULL;
- const uint64_t prime5 = 2870177450012600261ULL;
-
- uint64_t state[4];
- uint64_t result;
-
- uint8_t* stop = data + len;
- uint8_t* stop_block = stop - max_buffer_size64;
-
- state[0] = seed + prime1 + prime2;
- state[1] = seed + prime2;
- state[2] = seed;
- state[3] = seed - prime1;
-
- for(;data <= stop_block;){
- state[0] = pr64(state[0], data[0]);
- state[1] = pr64(state[1], data[1]);
- state[2] = pr64(state[2], data[2]);
- state[3] = pr64(state[3], data[3]);
-
- data += 32;
- }
-
- if(len >= max_buffer_size64){
- result = rol64(state[0], 1) + rol64(state[1], 7) +
- rol64(state[2], 12) + rol64(state[3], 18);
- result = (result ^ pr64(0, state[0])) * prime1 + prime4;
- result = (result ^ pr64(0, state[1])) * prime1 + prime4;
- result = (result ^ pr64(0, state[2])) * prime1 + prime4;
- result = (result ^ pr64(0, state[3])) * prime1 + prime4;
- } else {
- result = state[2] + prime5;
- }
- result += len;
-
- for (; data + 8 <= stop; data += 8)
- result = rol64(result ^ pr64(0, *(uint64_t*)data), 27) * prime1 + prime4;
-
- if (data + 4 <= stop){
- result = rol64(result ^ (*(uint32_t*)data) * prime1, 23) * prime2 + prime3;
- data += 4;
- }
-
- for(;data != stop;)
- result = rol64(result ^ (*data++) * prime5, 11) * prime1;
-
- result ^= result >> 33;
- result *= prime2;
- result ^= result >> 29;
- result *= prime3;
- result ^= result >> 32;
- return result;
-}
-
-int l_xxh64(lua_State* L){
-
- size_t len = 0;
- uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len);
- int argv = lua_gettop(L);
-
- uint64_t seed = 0;
- if(argv>1) seed = luaL_checkinteger(L, 2);
-
- char digest[64];
-
- uint64_t u = i_xxhash64(a, seed, len);
- sprintf(digest,"%016"PRIx64,u);
- lua_pushstring(L, digest);
-
- return 1;
-}
-
-int l_xxh32(lua_State* L){
-
- size_t len = 0;
- uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len);
- int argv = lua_gettop(L);
-
- uint32_t seed = 0;
- if(argv>1) seed = luaL_checkinteger(L, 2);
-
- char digest[32];
-
- uint32_t u = i_xxhash32(a, seed, len);
- sprintf(digest,"%x",u);
- lua_pushstring(L, digest);
-
- return 1;
-}
diff --git a/src/hash/xxh.h b/src/hash/xxh.h deleted file mode 100644 index 07e7579..0000000 --- a/src/hash/xxh.h +++ /dev/null @@ -1,25 +0,0 @@ -#include "../lua.h" -#include <stdint.h> - -/** - * calculates a xxhash32 of (len) bytes - * - * @param {uint8_t*} input bytes - * @param {uint32_t} hash seed - * @param {size_t} input length - * @return {uint32_t} 32 bit hash -*/ -uint32_t i_xxhash32(uint8_t*, uint32_t, size_t); - -/** - * calculates a xxhash64 of (len) bytes - * - * @param {uint8_t*} input bytes - * @param {uint64_t} hash seed - * @param {size_t} input length - * @return {uint64_t} 64 bit hash -*/ -uint64_t i_xxhash64(uint8_t*, uint64_t, size_t); - -int l_xxh32(lua_State*); -int l_xxh64(lua_State*); diff --git a/tests/hash.lua b/tests/hash.lua index 898b0e6..894d284 100644 --- a/tests/hash.lua +++ b/tests/hash.lua @@ -3,7 +3,7 @@ llib = require "lullaby" --llib.io.log = function() end
if table.unpack == nil then
- table.unpack = llib.array.unpack
+ table.unpack = llib.table.unpack
end
local hashes_working = 0
@@ -167,12 +167,7 @@ test("xxh32","meow","6ba6f6f0") test("xxh64","meow","bc11093a30a6315f")
test("buzhash8","meow","57")
test("buzhash16","meow","0255")
-test("cityhash32","meow","c41a03e9")
-test("cityhash64","meow","e99b592ae1ff868b")
-test("cityhash128","meow","d73f2b9c5501a6524097c5d815f2152")
test("djb2","meow","7c9a913d")
-test("farmhash32","meow","c41a03e9");
-test("farmhash64","meow","e99b592ae1ff868b")
--maybe test fasthash, metrohash, sha512_t and murmur blehh
test("fnv_0","meow","b0850402171532ac")
test("fnv_1","meow","c60a427ebfe83be5")
@@ -184,12 +179,6 @@ test("sdbm","meow","006d50f201921b00") test("sha512","meow","e88348269bad036160f0d9558b7c5de68163b50e1a6ce46e85ee64692eba074529a4a2b48db4d5c36496e845001e13e6d07c585eacd564defcbf719ec9033e17");
test("sha384","meow","f0bb848a382b5ed5e2f49a46252f6b738c933dc20bb29dc4a5d312e310b395c4fa07f30a8a7380b4a5d367445e0ea8cb")
test("sha512_t", "meow", "ad5e403e0d74532187f4e1665c7e705ab5eb3c2fe07ae73a3ff998b2", {224})
-test("fasthash64","meow","7b9e494cf11ee113")
-test("fasthash32","meow","758097c7")
-test("metrohash64_v1", "meow", "7435945e80261ed1")
-test("metrohash64_v2","meow","f951647d250e36f0")
-test("metrohash128_v1","meow","bfd8835cbcc06d2be6fc2c8e5ecbcc26")
-test("metrohash128_v2","meow","6d8634ccf529269297704cba8bf8707a")
test("murmur1_32","meow","743df82f")
test("murmur2_32","meow","05d01b88")
test("blake2b","meow","9919ae53fbea6c5da68e51b6e19a890fdbc01baf97fff29efd7efaa7163ea7aa205109b818bde29da815e16b869dbb2cb1b367ed1027f52116287d760808a43d")
|
