From 37ed0fc5fd92f7ae658cbcdf4c608714688ef7bf Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Thu, 11 Sep 2014 15:44:03 +1000 Subject: [PATCH] hash: cleanup fletcher --- hash/adler.cpp | 7 +++++-- hash/fletcher.hpp | 22 +++++++++++++++------- test/checksum.cpp | 7 ++++--- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/hash/adler.cpp b/hash/adler.cpp index 4e6855c1..8e46fb0e 100644 --- a/hash/adler.cpp +++ b/hash/adler.cpp @@ -24,14 +24,17 @@ static const unsigned MODULUS = 65521; +//----------------------------------------------------------------------------- uint32_t adler32 (const void* restrict _data, size_t _size) - { return fletcher<32, MODULUS, 1, 0> (_data, _size); } +{ + return adler32 ((uint8_t*)_data, (uint8_t*)_data + _size); +} //----------------------------------------------------------------------------- uint32_t adler32 (const uint8_t *first, const uint8_t *last) { - return adler32 (first, last - first); + return fletcher<32, MODULUS, 1, 0> (first, last - first); } diff --git a/hash/fletcher.hpp b/hash/fletcher.hpp index fe801b17..2f755f50 100644 --- a/hash/fletcher.hpp +++ b/hash/fletcher.hpp @@ -26,19 +26,27 @@ #include -template -typename bits_type::uint -fletcher (const void *restrict _data, size_t size) { - const uint8_t *restrict data = static_cast (_data); - typename bits_type::uint A = INITIAL_A, - B = INITIAL_B; +template < + unsigned OUTPUT, + unsigned MODULUS, + unsigned INITIAL_A, + unsigned INITIAL_B +> +typename bits_type::uint +fletcher (const void *restrict _data, + size_t size) +{ + typedef typename bits_type::uint temp_t; + + auto data = static_cast (_data); + temp_t A = INITIAL_A, B = INITIAL_B; for (size_t i = 0; i < size; ++i) { A = (A + data[i]) % MODULUS; B = (A + B) % MODULUS; } - return (B << (BITS / 2)) | A; + return (B << (OUTPUT / 2u)) + A; } #endif diff --git a/test/checksum.cpp b/test/checksum.cpp index ebf5bf31..386b2bf2 100644 --- a/test/checksum.cpp +++ b/test/checksum.cpp @@ -14,11 +14,12 @@ static const char *ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW static const struct { uint32_t adler; uint16_t bsd; - + const char *data; size_t size; } TESTS[] = { - { 0xDF5B150C, 0x52FB, ALPHABET, strlen (ALPHABET) } + { 0xDF5B150C, 0x52FB, ALPHABET, strlen (ALPHABET) }, + { 0x11E60398, 0x3DC8, "Wikipedia", strlen ("Wikipedia") } }; @@ -26,7 +27,7 @@ int main (int, char**) { for (unsigned i = 0; i < elems (TESTS); ++i) { CHECK_EQ (TESTS[i].adler, adler32 (TESTS[i].data, TESTS[i].size)); - CHECK_EQ (TESTS[i].bsd, bsdsum (TESTS[i].data, TESTS[i].size)); + CHECK_EQ (TESTS[i].bsd, bsdsum (TESTS[i].data, TESTS[i].size)); } return EXIT_SUCCESS;