github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/database/leveldb/include/util/crc32c.h (about)

     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_