From 1969b6c40bb4cf99f5034deb957e330920397e9c Mon Sep 17 00:00:00 2001 From: ame Date: Tue, 26 Mar 2024 13:03:34 -0500 Subject: docs and rolling adler --- src/hash/adler.c | 52 ++++++++++++++++++++++++++++++++++++++++++++-------- src/hash/adler.h | 20 ++++++++++++-------- 2 files changed, 56 insertions(+), 16 deletions(-) (limited to 'src/hash') diff --git a/src/hash/adler.c b/src/hash/adler.c index 3bd865a..ed7a84e 100644 --- a/src/hash/adler.c +++ b/src/hash/adler.c @@ -2,15 +2,50 @@ #include #include -uint32_t i_adler32(uint8_t *aa, size_t len){ - uint16_t a = 1, b = 0; +struct adler32_hash adler32_init(){ + return (struct adler32_hash){.a = 1, .b = 0}; +} + +void adler32_update(uint8_t* aa, size_t len, struct adler32_hash* hash){ + for(int i = 0; i != len; i++){ + hash->a += aa[i]; + hash->b += hash->a; + } +} + +uint32_t adler32_final(struct adler32_hash* hash){ + return hash->b * 65536 + hash->a; +} + +uint32_t adler32(uint8_t* aa, size_t len){ + struct adler32_hash dig = adler32_init(); + adler32_update(aa, len, &dig); + return adler32_final(&dig); +} + +int l_adler32_init(lua_State* L){ + struct adler32_hash* a = (struct adler32_hash*)lua_newuserdata(L, sizeof * a); + *a = adler32_init(); + return 1; +} - for(int i = 0; i != len; i++){ - a += aa[i]; - b += a; - } +int l_adler32_update(lua_State* L){ + struct adler32_hash* a = (struct adler32_hash*)lua_touserdata(L, 1); + size_t len = 0; + uint8_t* b = (uint8_t*)luaL_checklstring(L, 2, &len); + + adler32_update(b, len, a); + + return 1; +} - return b * 65536 + a; +int l_adler32_final(lua_State* L){ + struct adler32_hash* a = (struct adler32_hash*)lua_touserdata(L, 1); + uint32_t u = adler32_final(a); + char digest[32]; + sprintf(digest,"%08x",u); + lua_pushstring(L, digest); + return 1; } int l_adler32(lua_State* L){ @@ -19,7 +54,8 @@ int l_adler32(lua_State* L){ char digest[32]; - uint32_t u = i_adler32(a, len); + uint32_t u = adler32(a, len); + sprintf(digest,"%08x",u); lua_pushstring(L, digest); diff --git a/src/hash/adler.h b/src/hash/adler.h index 3bd8925..29a74f0 100644 --- a/src/hash/adler.h +++ b/src/hash/adler.h @@ -1,13 +1,17 @@ #include "../lua.h" #include -/*! - * \brief calculates a adler hash of (len) bytes - * - * @param {uint8_t*} input bytes - * @param {size_t} input length - * @return {uint32_t} 32 bit hash -*/ -uint32_t i_adler32(uint8_t*, size_t); +struct adler32_hash { + uint16_t a; + uint16_t b; +}; + +struct adler32_hash adler32_init(); +void adler32_update(uint8_t*, size_t, struct adler32_hash*); +uint32_t adler32_final(struct adler32_hash*); +uint32_t adler32(uint8_t*, size_t); int l_adler32(lua_State*); +int l_adler32_init(lua_State*); +int l_adler32_update(lua_State*); +int l_adler32_final(lua_State*); -- cgit v1.2.3