1 //  Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
2 //  This source code is licensed under both the GPLv2 (found in the
3 //  COPYING file in the root directory) and Apache 2.0 License
4 //  (found in the LICENSE.Apache file in the root directory).
5 //
6 // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
7 // Use of this source code is governed by a BSD-style license that can be
8 // found in the LICENSE file. See the AUTHORS file for names of contributors.
9 
10 #pragma once
11 #include <stddef.h>
12 #include <stdint.h>
13 #include <string>
14 
15 #include "rocksdb/rocksdb_namespace.h"
16 
17 namespace ROCKSDB_NAMESPACE {
18 namespace crc32c {
19 
20 extern std::string IsFastCrc32Supported();
21 
22 // Return the crc32c of concat(A, data[0,n-1]) where init_crc is the
23 // crc32c of some string A.  Extend() is often used to maintain the
24 // crc32c of a stream of data.
25 extern uint32_t Extend(uint32_t init_crc, const char* data, size_t n);
26 
27 // Return the crc32c of data[0,n-1]
Value(const char * data,size_t n)28 inline uint32_t Value(const char* data, size_t n) {
29   return Extend(0, data, n);
30 }
31 
32 static const uint32_t kMaskDelta = 0xa282ead8ul;
33 
34 // Return a masked representation of crc.
35 //
36 // Motivation: it is problematic to compute the CRC of a string that
37 // contains embedded CRCs.  Therefore we recommend that CRCs stored
38 // somewhere (e.g., in files) should be masked before being stored.
Mask(uint32_t crc)39 inline uint32_t Mask(uint32_t crc) {
40   // Rotate right by 15 bits and add a constant.
41   return ((crc >> 15) | (crc << 17)) + kMaskDelta;
42 }
43 
44 // Return the crc whose masked representation is masked_crc.
Unmask(uint32_t masked_crc)45 inline uint32_t Unmask(uint32_t masked_crc) {
46   uint32_t rot = masked_crc - kMaskDelta;
47   return ((rot >> 17) | (rot << 15));
48 }
49 
50 }  // namespace crc32c
51 }  // namespace ROCKSDB_NAMESPACE
52