| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/zucchini/crc32.h" |
| |
| #include <array> |
| |
| #include "base/check_op.h" |
| |
| namespace zucchini { |
| |
| namespace { |
| |
| std::array<uint32_t, 256> MakeCrc32Table() { |
| constexpr uint32_t kCrc32Poly = 0xEDB88320; |
| |
| std::array<uint32_t, 256> crc32Table; |
| for (uint32_t i = 0; i < 256; ++i) { |
| uint32_t r = i; |
| for (int j = 0; j < 8; ++j) |
| r = (r >> 1) ^ (kCrc32Poly & ~((r & 1) - 1)); |
| crc32Table[i] = r; |
| } |
| return crc32Table; |
| } |
| |
| } // namespace |
| |
| // Minimalistic CRC-32 implementation for Zucchini usage. Adapted from LZMA SDK |
| // (found at third_party/lzma_sdk/7zCrc.c), which is public domain. |
| uint32_t CalculateCrc32(const uint8_t* first, const uint8_t* last) { |
| DCHECK_GE(last, first); |
| |
| static const std::array<uint32_t, 256> kCrc32Table = MakeCrc32Table(); |
| |
| uint32_t ret = 0xFFFFFFFF; |
| for (; first != last; ++first) |
| ret = kCrc32Table[(ret ^ *first) & 0xFF] ^ (ret >> 8); |
| return ret ^ 0xFFFFFFFF; |
| } |
| |
| } // namespace zucchini |