/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2011-2018 Danny Robson */ #ifndef CRUFT_UTIL_HASH_CRC_HPP #define CRUFT_UTIL_HASH_CRC_HPP #include "../view.hpp" #include #include #include #include /////////////////////////////////////////////////////////////////////////////// namespace cruft::hash { // Implements the crc checksum (from ethernet, png, etc). // // Adapted from the PNG specification (ISO/IEC 15948:2003), appendix D and // the public domain implementation of Ross Williams. // // Generator: the polynomial, with the leading (ie, 32nd) high bit truncated. // Initial: value used to initialise the digest // Final: value to xor against the digest at finish time // ReflectIn: whether to reverse the bits of each data byte // ReflectOut: whether to reverse the bits of the digest at finish time // // Note that reflection isn't necessarily explicitly performed at update // time. Instead we construct the lookup table appropriately to use the // data values directly. template < typename DigestT, DigestT Generator, DigestT Initial, DigestT Final, bool ReflectIn, bool ReflectOut > class crc { public: using digest_t = DigestT; static constexpr auto generator = Generator; digest_t operator() (cruft::view) const noexcept; static constexpr std::array table (void); private: static const std::array s_table; }; using crc32 = crc; using crc32b = crc; using crc32c = crc; using crc32d = crc; using crc64 = crc; } #endif