xref: /aosp_15_r20/external/webrtc/third_party/crc32c/src/README.md (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker# CRC32C
2*d9f75844SAndroid Build Coastguard Worker
3*d9f75844SAndroid Build Coastguard Worker[![Build Status](https://travis-ci.org/google/crc32c.svg?branch=master)](https://travis-ci.org/google/crc32c)
4*d9f75844SAndroid Build Coastguard Worker[![Build Status](https://ci.appveyor.com/api/projects/status/moiq7331pett4xuj/branch/master?svg=true)](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