/* * Copyright 2015 Eistec AB * * This file is subject to the terms and conditions of the GNU Lesser * General Public License v2.1. See the file LICENSE in the top level * directory for more details. */ /** * @ingroup sys_checksum_fletcher32 * @{ * * @file * @brief Fletcher32 implementation * * @author Joakim NohlgÄrd * * @} */ #include "checksum/fletcher32.h" uint32_t fletcher32(const uint16_t *data, size_t words) { uint32_t sum1 = 0xffff, sum2 = 0xffff; while (words) { unsigned tlen = words > 359 ? 359 : words; words -= tlen; do { sum2 += sum1 += *data++; } while (--tlen); sum1 = (sum1 & 0xffff) + (sum1 >> 16); sum2 = (sum2 & 0xffff) + (sum2 >> 16); } /* Second reduction step to reduce sums to 16 bits */ sum1 = (sum1 & 0xffff) + (sum1 >> 16); sum2 = (sum2 & 0xffff) + (sum2 >> 16); return (sum2 << 16) | sum1; }