1*d9f75844SAndroid Build Coastguard Worker# CRC32C 2*d9f75844SAndroid Build Coastguard Worker 3*d9f75844SAndroid Build Coastguard Worker[](https://travis-ci.org/google/crc32c) 4*d9f75844SAndroid Build Coastguard Worker[](https://ci.appveyor.com/project/pwnall/crc32c) 5*d9f75844SAndroid Build Coastguard Worker 6*d9f75844SAndroid Build Coastguard WorkerNew file format authors should consider 7*d9f75844SAndroid Build Coastguard Worker[HighwayHash](https://github.com/google/highwayhash). The initial version of 8*d9f75844SAndroid Build Coastguard Workerthis code was extracted from [LevelDB](https://github.com/google/leveldb), which 9*d9f75844SAndroid Build Coastguard Workeris a stable key-value store that is widely used at Google. 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard WorkerThis project collects a few CRC32C implementations under an umbrella that 12*d9f75844SAndroid Build Coastguard Workerdispatches to a suitable implementation based on the host computer's hardware 13*d9f75844SAndroid Build Coastguard Workercapabilities. 14*d9f75844SAndroid Build Coastguard Worker 15*d9f75844SAndroid Build Coastguard WorkerCRC32C is specified as the CRC that uses the iSCSI polynomial in 16*d9f75844SAndroid Build Coastguard Worker[RFC 3720](https://tools.ietf.org/html/rfc3720#section-12.1). The polynomial was 17*d9f75844SAndroid Build Coastguard Workerintroduced by G. Castagnoli, S. Braeuer and M. Herrmann. CRC32C is used in 18*d9f75844SAndroid Build Coastguard Workersoftware such as Btrfs, ext4, Ceph and leveldb. 19*d9f75844SAndroid Build Coastguard Worker 20*d9f75844SAndroid Build Coastguard Worker 21*d9f75844SAndroid Build Coastguard Worker## Usage 22*d9f75844SAndroid Build Coastguard Worker 23*d9f75844SAndroid Build Coastguard Worker```cpp 24*d9f75844SAndroid Build Coastguard Worker#include "crc32c/crc32c.h" 25*d9f75844SAndroid Build Coastguard Worker 26*d9f75844SAndroid Build Coastguard Workerint main() { 27*d9f75844SAndroid Build Coastguard Worker const std::uint8_t buffer[] = {0, 0, 0, 0}; 28*d9f75844SAndroid Build Coastguard Worker std::uint32_t result; 29*d9f75844SAndroid Build Coastguard Worker 30*d9f75844SAndroid Build Coastguard Worker // Process a raw buffer. 31*d9f75844SAndroid Build Coastguard Worker result = crc32c::Crc32c(buffer, 4); 32*d9f75844SAndroid Build Coastguard Worker 33*d9f75844SAndroid Build Coastguard Worker // Process a std::string. 34*d9f75844SAndroid Build Coastguard Worker std::string string; 35*d9f75844SAndroid Build Coastguard Worker string.resize(4); 36*d9f75844SAndroid Build Coastguard Worker result = crc32c::Crc32c(string); 37*d9f75844SAndroid Build Coastguard Worker 38*d9f75844SAndroid Build Coastguard Worker // If you have C++17 support, process a std::string_view. 39*d9f75844SAndroid Build Coastguard Worker std::string_view string_view(string); 40*d9f75844SAndroid Build Coastguard Worker result = crc32c::Crc32c(string_view); 41*d9f75844SAndroid Build Coastguard Worker 42*d9f75844SAndroid Build Coastguard Worker return 0; 43*d9f75844SAndroid Build Coastguard Worker} 44*d9f75844SAndroid Build Coastguard Worker``` 45*d9f75844SAndroid Build Coastguard Worker 46*d9f75844SAndroid Build Coastguard Worker 47*d9f75844SAndroid Build Coastguard Worker## Prerequisites 48*d9f75844SAndroid Build Coastguard Worker 49*d9f75844SAndroid Build Coastguard WorkerThis project uses [CMake](https://cmake.org/) for building and testing. CMake is 50*d9f75844SAndroid Build Coastguard Workeravailable in all popular Linux distributions, as well as in 51*d9f75844SAndroid Build Coastguard Worker[Homebrew](https://brew.sh/). 52*d9f75844SAndroid Build Coastguard Worker 53*d9f75844SAndroid Build Coastguard WorkerThis project uses submodules for dependency management. 54*d9f75844SAndroid Build Coastguard Worker 55*d9f75844SAndroid Build Coastguard Worker```bash 56*d9f75844SAndroid Build Coastguard Workergit submodule update --init --recursive 57*d9f75844SAndroid Build Coastguard Worker``` 58*d9f75844SAndroid Build Coastguard Worker 59*d9f75844SAndroid Build Coastguard WorkerIf you're using [Atom](https://atom.io/), the following packages can help. 60*d9f75844SAndroid Build Coastguard Worker 61*d9f75844SAndroid Build Coastguard Worker```bash 62*d9f75844SAndroid Build Coastguard Workerapm install autocomplete-clang build build-cmake clang-format language-cmake \ 63*d9f75844SAndroid Build Coastguard Worker linter linter-clang 64*d9f75844SAndroid Build Coastguard Worker``` 65*d9f75844SAndroid Build Coastguard Worker 66*d9f75844SAndroid Build Coastguard WorkerIf you don't mind more setup in return for more speed, replace 67*d9f75844SAndroid Build Coastguard Worker`autocomplete-clang` and `linter-clang` with `you-complete-me`. This requires 68*d9f75844SAndroid Build Coastguard Worker[setting up ycmd](https://github.com/ycm-core/ycmd#building). 69*d9f75844SAndroid Build Coastguard Worker 70*d9f75844SAndroid Build Coastguard Worker```bash 71*d9f75844SAndroid Build Coastguard Workerapm install autocomplete-plus build build-cmake clang-format language-cmake \ 72*d9f75844SAndroid Build Coastguard Worker linter you-complete-me 73*d9f75844SAndroid Build Coastguard Worker``` 74*d9f75844SAndroid Build Coastguard Worker 75*d9f75844SAndroid Build Coastguard Worker## Building 76*d9f75844SAndroid Build Coastguard Worker 77*d9f75844SAndroid Build Coastguard WorkerThe following commands build and install the project. 78*d9f75844SAndroid Build Coastguard Worker 79*d9f75844SAndroid Build Coastguard Worker```bash 80*d9f75844SAndroid Build Coastguard Workermkdir build 81*d9f75844SAndroid Build Coastguard Workercd build 82*d9f75844SAndroid Build Coastguard Workercmake -DCRC32C_BUILD_TESTS=0 -DCRC32C_BUILD_BENCHMARKS=0 .. && make all install 83*d9f75844SAndroid Build Coastguard Worker``` 84*d9f75844SAndroid Build Coastguard Worker 85*d9f75844SAndroid Build Coastguard Worker 86*d9f75844SAndroid Build Coastguard Worker## Development 87*d9f75844SAndroid Build Coastguard Worker 88*d9f75844SAndroid Build Coastguard WorkerThe following command (when executed from `build/`) (re)builds the project and 89*d9f75844SAndroid Build Coastguard Workerruns the tests. 90*d9f75844SAndroid Build Coastguard Worker 91*d9f75844SAndroid Build Coastguard Worker```bash 92*d9f75844SAndroid Build Coastguard Workercmake .. && cmake --build . && ctest --output-on-failure 93*d9f75844SAndroid Build Coastguard Worker``` 94*d9f75844SAndroid Build Coastguard Worker 95*d9f75844SAndroid Build Coastguard Worker 96*d9f75844SAndroid Build Coastguard Worker### Android testing 97*d9f75844SAndroid Build Coastguard Worker 98*d9f75844SAndroid Build Coastguard WorkerThe following command builds the project against the Android NDK, which is 99*d9f75844SAndroid Build Coastguard Workeruseful for benchmarking against ARM processors. 100*d9f75844SAndroid Build Coastguard Worker 101*d9f75844SAndroid Build Coastguard Worker```bash 102*d9f75844SAndroid Build Coastguard Workercmake .. -DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \ 103*d9f75844SAndroid Build Coastguard Worker -DCMAKE_ANDROID_NDK=$HOME/Library/Android/sdk/ndk-bundle \ 104*d9f75844SAndroid Build Coastguard Worker -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang \ 105*d9f75844SAndroid Build Coastguard Worker -DCMAKE_ANDROID_STL_TYPE=c++_static -DCRC32C_USE_GLOG=0 \ 106*d9f75844SAndroid Build Coastguard Worker -DCMAKE_BUILD_TYPE=Release && cmake --build . 107*d9f75844SAndroid Build Coastguard Worker``` 108*d9f75844SAndroid Build Coastguard Worker 109*d9f75844SAndroid Build Coastguard WorkerThe following commands install and run the benchmarks. 110*d9f75844SAndroid Build Coastguard Worker 111*d9f75844SAndroid Build Coastguard Worker```bash 112*d9f75844SAndroid Build Coastguard Workeradb push crc32c_bench /data/local/tmp 113*d9f75844SAndroid Build Coastguard Workeradb shell chmod +x /data/local/tmp/crc32c_bench 114*d9f75844SAndroid Build Coastguard Workeradb shell 'cd /data/local/tmp && ./crc32c_bench' 115*d9f75844SAndroid Build Coastguard Workeradb shell rm /data/local/tmp/crc32c_bench 116*d9f75844SAndroid Build Coastguard Worker``` 117*d9f75844SAndroid Build Coastguard Worker 118*d9f75844SAndroid Build Coastguard WorkerThe following commands install and run the tests. 119*d9f75844SAndroid Build Coastguard Worker 120*d9f75844SAndroid Build Coastguard Worker```bash 121*d9f75844SAndroid Build Coastguard Workeradb push crc32c_tests /data/local/tmp 122*d9f75844SAndroid Build Coastguard Workeradb shell chmod +x /data/local/tmp/crc32c_tests 123*d9f75844SAndroid Build Coastguard Workeradb shell 'cd /data/local/tmp && ./crc32c_tests' 124*d9f75844SAndroid Build Coastguard Workeradb shell rm /data/local/tmp/crc32c_tests 125*d9f75844SAndroid Build Coastguard Worker``` 126