Home | History | Annotate | Download | only in base
      1 /*
      2  *  Copyright 2012 The WebRTC Project Authors. All rights reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include "webrtc/base/crc32.h"
     12 
     13 #include "webrtc/base/arraysize.h"
     14 
     15 namespace rtc {
     16 
     17 // This implementation is based on the sample implementation in RFC 1952.
     18 
     19 // CRC32 polynomial, in reversed form.
     20 // See RFC 1952, or http://en.wikipedia.org/wiki/Cyclic_redundancy_check
     21 static const uint32_t kCrc32Polynomial = 0xEDB88320;
     22 static uint32_t kCrc32Table[256] = {0};
     23 
     24 static void EnsureCrc32TableInited() {
     25   if (kCrc32Table[arraysize(kCrc32Table) - 1])
     26     return;  // already inited
     27   for (uint32_t i = 0; i < arraysize(kCrc32Table); ++i) {
     28     uint32_t c = i;
     29     for (size_t j = 0; j < 8; ++j) {
     30       if (c & 1) {
     31         c = kCrc32Polynomial ^ (c >> 1);
     32       } else {
     33         c >>= 1;
     34       }
     35     }
     36     kCrc32Table[i] = c;
     37   }
     38 }
     39 
     40 uint32_t UpdateCrc32(uint32_t start, const void* buf, size_t len) {
     41   EnsureCrc32TableInited();
     42 
     43   uint32_t c = start ^ 0xFFFFFFFF;
     44   const uint8_t* u = static_cast<const uint8_t*>(buf);
     45   for (size_t i = 0; i < len; ++i) {
     46     c = kCrc32Table[(c ^ u[i]) & 0xFF] ^ (c >> 8);
     47   }
     48   return c ^ 0xFFFFFFFF;
     49 }
     50 
     51 }  // namespace rtc
     52 
     53