aboutsummaryrefslogtreecommitdiff
path: root/src/hash
diff options
context:
space:
mode:
authorame <[email protected]>2024-03-26 13:03:34 -0500
committerame <[email protected]>2024-03-26 13:03:34 -0500
commitc6e8e66aa91bffa649e9192d3e4e0658d78d0ad6 (patch)
tree92c3ca36793550864bbb32cf13ea0e606eab999b /src/hash
parentdc51f7b892ff5a6790a7d728a3acac363588ede2 (diff)
docs and rolling adler
Diffstat (limited to 'src/hash')
-rw-r--r--src/hash/adler.c52
-rw-r--r--src/hash/adler.h20
2 files changed, 56 insertions, 16 deletions
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 <stdio.h>
#include <stdint.h>
-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 <stdint.h>
-/*!
- * \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*);