diff options
| author | ame <[email protected]> | 2024-03-28 12:41:17 -0500 |
|---|---|---|
| committer | ame <[email protected]> | 2024-03-28 12:41:17 -0500 |
| commit | 35c37ef1221d5860731435137059dc4533adff42 (patch) | |
| tree | fc3dcf74e40ade1ebeb8cbb270fe28f8ce7b63b5 /src/hash | |
| parent | 2a2615374054f42221bd5b9a58c7b18628a1dbea (diff) | |
more hashes fixed
Diffstat (limited to 'src/hash')
| -rw-r--r-- | src/hash/djb2.c | 39 | ||||
| -rw-r--r-- | src/hash/djb2.h | 11 | ||||
| -rw-r--r-- | src/hash/fletcher.c | 127 | ||||
| -rw-r--r-- | src/hash/fletcher.h | 63 | ||||
| -rw-r--r-- | src/hash/fnv.c | 74 | ||||
| -rw-r--r-- | src/hash/fnv.h | 19 | ||||
| -rw-r--r-- | src/hash/jenkins.c | 51 | ||||
| -rw-r--r-- | src/hash/jenkins.h | 11 |
8 files changed, 305 insertions, 90 deletions
diff --git a/src/hash/djb2.c b/src/hash/djb2.c index 89f3a00..cd1fb2a 100644 --- a/src/hash/djb2.c +++ b/src/hash/djb2.c @@ -2,18 +2,43 @@ #include <stdio.h> #include <stdint.h> -uint32_t djb2(uint8_t* in, size_t len){ - uint32_t hash = 5381; +struct djb2_hash djb2_init(){ + return (struct djb2_hash){.hash = 5381}; +} + +void djb2_update(uint8_t * in, size_t len, struct djb2_hash * hash){ + for(int i = 0; i != len; i++){ + hash->hash = ((hash->hash << 5) + hash->hash) + (uint32_t)*in; + in++; + } +} + +uint32_t djb2_final(struct djb2_hash * hash){ + return hash->hash; +} + +uint32_t djb2(uint8_t * in, size_t len){ + struct djb2_hash a = djb2_init(); + djb2_update(in, len, &a); + return djb2_final(&a); +} + +common_hash_init_update(djb2); - for(int i = 0; i != len; i++){ - hash = ((hash << 5) + hash) + (uint32_t)*in; - in++; - } +int l_djb2_final(lua_State* L){ + lua_pushstring(L, "ud"); + lua_gettable(L, 1); - return hash; + struct djb2_hash* a = (struct djb2_hash*)lua_touserdata(L, -1); + uint32_t u = djb2_final(a); + char digest[64]; + sprintf(digest,"%08x",u); + lua_pushstring(L, digest); + return 1; } int l_djb2(lua_State* L){ + if(lua_gettop(L) == 0) return l_djb2_init(L); size_t len = 0; uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len); diff --git a/src/hash/djb2.h b/src/hash/djb2.h index ab0d20f..d944d11 100644 --- a/src/hash/djb2.h +++ b/src/hash/djb2.h @@ -1,5 +1,16 @@ #include "../lua.h" #include <stdint.h> +struct djb2_hash { + uint32_t hash; +}; + +struct djb2_hash djb2_init(); +void djb2_update(uint8_t*, size_t, struct djb2_hash*); +uint32_t djb2_final(struct djb2_hash*); uint32_t djb2(uint8_t*, size_t); + int l_djb2(lua_State*); +int l_djb2_init(lua_State*); +int l_djb2_update(lua_State*); +int l_djb2_final(lua_State*); diff --git a/src/hash/fletcher.c b/src/hash/fletcher.c index 0d82fd0..1ab1857 100644 --- a/src/hash/fletcher.c +++ b/src/hash/fletcher.c @@ -2,44 +2,117 @@ #include <stdio.h> #include <stdint.h> -uint8_t i_fletcher8(uint8_t *aa, size_t len){ - uint8_t s1 = 0, s2 = 0; +struct fletcher8_hash fletcher8_init(){ + return (struct fletcher8_hash){.s1 = 0, .s2 = 0}; +} + +void fletcher8_update(uint8_t *aa, size_t len, struct fletcher8_hash *hash){ + for(int i = 0; i != len; i++){ + hash->s1 = (hash->s1 + aa[i]) % 15; + hash->s2 = (hash->s2 + hash->s1) % 15; + } +} + +uint8_t fletcher8_final(struct fletcher8_hash *hash){ + return (hash->s2 << 4) | hash->s1; +} + +uint8_t fletcher8(uint8_t *aa, size_t len){ + struct fletcher8_hash a = fletcher8_init(); + fletcher8_update(aa, len, &a); + return fletcher8_final(&a); +} + +struct fletcher16_hash fletcher16_init(){ + return (struct fletcher16_hash){.s1 = 0, .s2 = 0}; +} + +void fletcher16_update(uint8_t *aa, size_t len, struct fletcher16_hash *hash){ + for(int i = 0; i != len; i++){ + hash->s1 = (hash->s1 + aa[i]) % 255; + hash->s2 = (hash->s2 + hash->s1) % 255; + } +} + +uint16_t fletcher16_final(struct fletcher16_hash *hash){ + return (hash->s2 << 8) | hash->s1; +} + +uint16_t fletcher16(uint8_t *aa, size_t len){ + struct fletcher16_hash a = fletcher16_init(); + fletcher16_update(aa, len, &a); + return fletcher16_final(&a); +} + +struct fletcher32_hash fletcher32_init(){ + return (struct fletcher32_hash){.s1 = 0, .s2 = 0}; +} + +void fletcher32_update(uint8_t *aa, size_t len, struct fletcher32_hash *hash){ + for(int i = 0; i != len; i++){ + hash->s1 = (hash->s1 + aa[i]) % 65535; + hash->s2 = (hash->s2 + hash->s1) % 65535; + } +} + +uint32_t fletcher32_final(struct fletcher32_hash *hash){ + return (hash->s2 << 16) | hash->s1; +} + +uint32_t fletcher32(uint8_t *aa, size_t len){ + struct fletcher32_hash a = fletcher32_init(); + fletcher32_update(aa, len, &a); + return fletcher32_final(&a); +} + +common_hash_init_update(fletcher8); +common_hash_init_update(fletcher16); +common_hash_init_update(fletcher32); + +int l_fletcher8_final(lua_State* L){ + lua_pushstring(L, "ud"); + lua_gettable(L, 1); - for(int i = 0; i != len; i++){ - s1 = (s1 + aa[i]) % 15; - s2 = (s2 + s1) % 15; - } - return (s2 << 4) | s1; + struct fletcher8_hash* a = (struct fletcher8_hash*)lua_touserdata(L, -1); + uint8_t u = fletcher8_final(a); + char digest[8]; + sprintf(digest,"%02x",u); + lua_pushstring(L, digest); + return 1; } -uint16_t i_fletcher16(uint8_t *aa, size_t len){ - uint16_t s1 = 0, s2 = 0; +int l_fletcher16_final(lua_State* L){ + lua_pushstring(L, "ud"); + lua_gettable(L, 1); - for(int i = 0; i != len; i++){ - s1 = (s1 + aa[i]) % 255; - s2 = (s2 + s1) % 255; - } - return (s2 << 8) | s1; + struct fletcher16_hash* a = (struct fletcher16_hash*)lua_touserdata(L, -1); + uint16_t u = fletcher16_final(a); + char digest[16]; + sprintf(digest,"%04x",u); + lua_pushstring(L, digest); + return 1; } -uint32_t i_fletcher32(uint8_t *aa, size_t len){ - uint32_t s1 = 0, s2 = 0; +int l_fletcher32_final(lua_State* L){ + lua_pushstring(L, "ud"); + lua_gettable(L, 1); - for(int i = 0; i != len; i++){ - s1 = (s1 + aa[i]) % 65535; - s2 = (s2 + s1) % 65535; - } - return (s2 << 16) | s1; + struct fletcher32_hash* a = (struct fletcher32_hash*)lua_touserdata(L, -1); + uint32_t u = fletcher32_final(a); + char digest[32]; + sprintf(digest,"%08x",u); + lua_pushstring(L, digest); + return 1; } int l_fletcher32(lua_State* L){ - + if(lua_gettop(L) == 0) return l_fletcher32_init(L); size_t len = 0; uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len); char digest[32]; - uint32_t u = i_fletcher32(a, len); + uint32_t u = fletcher32(a, len); sprintf(digest,"%08x",u); lua_pushstring(L, digest); @@ -47,13 +120,13 @@ int l_fletcher32(lua_State* L){ } int l_fletcher16(lua_State* L){ - + if(lua_gettop(L) == 0) return l_fletcher16_init(L); size_t len = 0; uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len); char digest[16]; - uint16_t u = i_fletcher16(a, len); + uint16_t u = fletcher16(a, len); sprintf(digest,"%04x",u); lua_pushstring(L, digest); @@ -61,13 +134,13 @@ int l_fletcher16(lua_State* L){ } int l_fletcher8(lua_State* L){ - + if(lua_gettop(L) == 0) return l_fletcher8_init(L); size_t len = 0; uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len); char digest[8]; - uint8_t u = i_fletcher8(a, len); + uint8_t u = fletcher8(a, len); sprintf(digest,"%02x",u); lua_pushstring(L, digest); diff --git a/src/hash/fletcher.h b/src/hash/fletcher.h index c77bce4..d66692f 100644 --- a/src/hash/fletcher.h +++ b/src/hash/fletcher.h @@ -1,33 +1,44 @@ #include "../lua.h" #include <stdint.h> -/** - * calculates a fletcher hash of (len) bytes - * - * @param {uint8_t*} input bytes - * @param {size_t} input length - * @return {uint8_t} 8 bit hash -*/ -uint8_t i_fletcher8(uint8_t*,size_t); - -/** - * calculates a fletcher hash of (len) bytes - * - * @param {uint8_t*} input bytes - * @param {size_t} input length - * @return {uint16_t} 16 bit checksum -*/ -uint16_t i_fletcher16(uint8_t*,size_t); - -/** - * calculates a fletcher hash of (len) bytes - * - * @param {uint8_t*} input bytes - * @param {size_t} input length - * @return {uint32_t} 32 bit checksum -*/ -uint32_t i_fletcher32(uint8_t*,size_t); +struct fletcher8_hash { + uint8_t s1, s2; +}; + +struct fletcher16_hash { + uint16_t s1, s2; +}; + +struct fletcher32_hash { + uint32_t s1, s2; +}; + +uint8_t fletcher8(uint8_t*,size_t); +struct fletcher8_hash fletcher8_init(); +void fletcher8_update(uint8_t*, size_t, struct fletcher8_hash*); +uint8_t fletcher8_final(struct fletcher8_hash*); + +uint16_t fletcher16(uint8_t*,size_t); +struct fletcher16_hash fletcher16_init(); +void fletcher16_update(uint8_t*, size_t, struct fletcher16_hash*); +uint16_t fletcher16_final(struct fletcher16_hash*); + +uint32_t fletcher32(uint8_t*,size_t); +struct fletcher32_hash fletcher32_init(); +void fletcher32_update(uint8_t*, size_t, struct fletcher32_hash*); +uint32_t fletcher32_final(struct fletcher32_hash*); int l_fletcher32(lua_State*); +int l_fletcher32_init(lua_State*); +int l_fletcher32_update(lua_State*); +int l_fletcher32_final(lua_State*); + int l_fletcher16(lua_State*); +int l_fletcher16_init(lua_State*); +int l_fletcher16_update(lua_State*); +int l_fletcher16_final(lua_State*); + int l_fletcher8(lua_State*); +int l_fletcher8_init(lua_State*); +int l_fletcher8_update(lua_State*); +int l_fletcher8_final(lua_State*);
\ No newline at end of file diff --git a/src/hash/fnv.c b/src/hash/fnv.c index 9d5c646..e0fc981 100644 --- a/src/hash/fnv.c +++ b/src/hash/fnv.c @@ -3,29 +3,65 @@ #include <stdio.h> #include <stdint.h> +struct fnv_1_hash fnv_1_init(enum fnv_version A){ + return (struct fnv_1_hash){.A = A, .hash = (A != v_0) * 0xcbf29ce484222325}; +} -uint64_t fnv_1(uint8_t* in, size_t len, enum fnv_version A){ - uint64_t hash = (A != v_0) * 0xcbf29ce484222325; - uint64_t prime = 0x100000001b3; - - for(int i = 0; i != len; i++){ - switch(A){ - case v_1: - case v_0: - hash *= prime; - hash ^= in[i]; - break; - case v_a: - hash ^= in[i]; - hash *= prime; - break; - } +void fnv_1_update(uint8_t* in, size_t len, struct fnv_1_hash* hash){ + uint64_t prime = 0x100000001b3; + + for(int i = 0; i != len; i++){ + switch(hash->A){ + case v_1: + case v_0: + hash->hash *= prime; + hash->hash ^= in[i]; + break; + case v_a: + hash->hash ^= in[i]; + hash->hash *= prime; + break; } + } +} + +uint64_t fnv_1_final(struct fnv_1_hash* hash){ + return hash->hash; +} - return hash; +uint64_t fnv_1(uint8_t* in, size_t len, enum fnv_version A){ + struct fnv_1_hash a = fnv_1_init(A); + fnv_1_update(in, len, &a); + return fnv_1_final(&a); +} + +lua_common_hash_update(fnv_1, fnv_1); +lua_common_hash_update(fnv_1, fnv_0); +lua_common_hash_update(fnv_1, fnv_a); + +lua_common_hash_init_warg(fnv_1, fnv_1, ;, v_1); +lua_common_hash_init_warg(fnv_1, fnv_0, ;, v_0); +lua_common_hash_init_warg(fnv_1, fnv_a, ;, v_a); + +#define aaa(v)\ +int l_fnv_##v##_final(lua_State* L){\ + lua_pushstring(L, "ud");\ + lua_gettable(L, 1);\ +\ + struct fnv_1_hash* a = (struct fnv_1_hash*)lua_touserdata(L, -1);\ + uint64_t u = fnv_1_final(a);\ + char digest[64];\ + sprintf(digest,"%16llx",u);\ + lua_pushstring(L, digest);\ + return 1;\ } -int l_fnv_0(lua_State* L){ +aaa(0); +aaa(1); +aaa(a); + +int l_fnv_0(lua_State* L){ + if(lua_gettop(L) == 0) return l_fnv_0_init(L); size_t len = 0; uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len); @@ -38,6 +74,7 @@ int l_fnv_0(lua_State* L){ } int l_fnv_1(lua_State* L){ + if(lua_gettop(L) == 0) return l_fnv_1_init(L); size_t len = 0; uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len); @@ -50,6 +87,7 @@ int l_fnv_1(lua_State* L){ } int l_fnv_a(lua_State* L){ + if(lua_gettop(L) == 0) return l_fnv_a_init(L); size_t len = 0; uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len); diff --git a/src/hash/fnv.h b/src/hash/fnv.h index 74f1722..a4299c9 100644 --- a/src/hash/fnv.h +++ b/src/hash/fnv.h @@ -5,8 +5,27 @@ enum fnv_version { v_1, v_a, v_0 }; +struct fnv_1_hash { + enum fnv_version A; + uint64_t hash; +}; + uint64_t fnv_1(uint8_t*, size_t, enum fnv_version); +struct fnv_1_hash fnv_1_init(enum fnv_version); +void fnv_1_update(uint8_t*, size_t, struct fnv_1_hash*); +uint64_t fnv_1_final(struct fnv_1_hash*); int l_fnv_1(lua_State*); +int l_fnv_1_init(lua_State*); +int l_fnv_1_update(lua_State*); +int l_fnv_1_final(lua_State*); + int l_fnv_a(lua_State*); +int l_fnv_a_init(lua_State*); +int l_fnv_a_update(lua_State*); +int l_fnv_a_final(lua_State*); + int l_fnv_0(lua_State*); +int l_fnv_0_init(lua_State*); +int l_fnv_0_update(lua_State*); +int l_fnv_0_final(lua_State*); diff --git a/src/hash/jenkins.c b/src/hash/jenkins.c index a08f526..6daf831 100644 --- a/src/hash/jenkins.c +++ b/src/hash/jenkins.c @@ -3,22 +3,49 @@ #include <stdio.h> #include <stdint.h> +struct jenkins_oaat_hash jenkins_oaat_init(){ + return (struct jenkins_oaat_hash){.hash = 0}; +} + +void jenkins_oaat_update(uint8_t* in, size_t len, struct jenkins_oaat_hash* hash){ + for(int i = 0; i != len;){ + hash->hash += in[i++]; + hash->hash += hash->hash << 10; + hash->hash ^= hash->hash >> 6; + } +} + +uint32_t jenkins_oaat_final(struct jenkins_oaat_hash* hash){ + hash->hash += hash->hash << 3; + hash->hash ^= hash->hash >> 11; + hash->hash += hash->hash << 15; + + return hash->hash; +} + + uint32_t jenkins_oaat(uint8_t* in, size_t len){ - uint32_t hash = 0; - - for(int i = 0; i != len;){ - hash += in[i++]; - hash += hash << 10; - hash ^= hash >> 6; - } - hash += hash << 3; - hash ^= hash >> 11; - hash += hash << 15; - - return hash; + struct jenkins_oaat_hash a = jenkins_oaat_init(); + jenkins_oaat_update(in, len, &a); + return jenkins_oaat_final(&a); +} + +lua_common_hash_init_update(jenkins_oaat, oaat); + +int l_oaat_final(lua_State* L){ + lua_pushstring(L, "ud"); + lua_gettable(L, 1); + + struct jenkins_oaat_hash* a = (struct jenkins_oaat_hash*)lua_touserdata(L, -1); + uint32_t u = jenkins_oaat_final(a); + char digest[64]; + sprintf(digest,"%04x",u); + lua_pushstring(L, digest); + return 1; } int l_oaat(lua_State* L){ + if(lua_gettop(L) == 0) return l_oaat_init(L); size_t len = 0; uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, &len); diff --git a/src/hash/jenkins.h b/src/hash/jenkins.h index d295896..9b5b465 100644 --- a/src/hash/jenkins.h +++ b/src/hash/jenkins.h @@ -1,5 +1,16 @@ #include "../lua.h" #include <stdint.h> +struct jenkins_oaat_hash { + uint32_t hash; +}; + uint32_t jenkins_oaat(uint8_t* in, size_t len); +struct jenkins_oaat_hash jenkins_oaat_init(); +void jenkins_oaat_update(uint8_t*, size_t, struct jenkins_oaat_hash*); +uint32_t jenkins_oaat_final(struct jenkins_oaat_hash*); + int l_oaat(lua_State*); +int l_oaat_init(lua_State*); +int l_oaat_update(lua_State*); +int l_oaat_final(lua_State*); |
