diff --git a/hash/hash_adler32.c b/hash/hash_adler32.c new file mode 100644 index 00000000..520ab426 --- /dev/null +++ b/hash/hash_adler32.c @@ -0,0 +1,54 @@ +/** + * @addtogroup hash Hash algorithms + * @{ + * @file hash_adler32.c + * @author [Christian Bender](https://github.com/christianbender) + * @author [Krishna Vedala](https://github.com/kvedala) + * @brief 32-bit [Adler hash](https://en.wikipedia.org/wiki/Adler-32) algorithm + */ +#include +#include +#include + +/** + * @brief 32-bit Adler algorithm implementation + * + * @param s NULL terminated ASCII string to hash + * @return 32-bit hash result + */ +uint32_t adler32(const char* s) +{ + uint32_t a = 1; + uint32_t b = 0; + const uint32_t MODADLER = 65521; + + size_t i = 0; + while (s[i] != '\0') + { + a = (a + s[i]) % MODADLER; + b = (b + a) % MODADLER; + i++; + } + return (b << 16) | a; +} + +/** + * @brief Test function for ::adler32 + */ +void test_adler32() +{ + assert(adler32("Hello World") == 403375133); + assert(adler32("Hello World!") == 474547262); + assert(adler32("Hello world") == 413860925); + assert(adler32("Hello world!") == 487130206); + printf("Tests passed\n"); +} + +/** @} */ + +/** Main function */ +int main() +{ + test_adler32(); + return 0; +}