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