1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package com.google.common.hash;
16
17
18
19
20
21
22
23 final class Crc32cHashFunction extends AbstractStreamingHashFunction {
24
25 @Override
26 public int bits() {
27 return 32;
28 }
29
30 @Override
31 public Hasher newHasher() {
32 return new Crc32cHasher();
33 }
34
35 @Override
36 public String toString() {
37 return "Hashing.crc32c()";
38 }
39
40 static final class Crc32cHasher extends AbstractByteHasher {
41
42
43 static final int[] CRC_TABLE = {
44 0x00000000, 0xf26b8303, 0xe13b70f7, 0x1350f3f4,
45 0xc79a971f, 0x35f1141c, 0x26a1e7e8, 0xd4ca64eb,
46 0x8ad958cf, 0x78b2dbcc, 0x6be22838, 0x9989ab3b,
47 0x4d43cfd0, 0xbf284cd3, 0xac78bf27, 0x5e133c24,
48 0x105ec76f, 0xe235446c, 0xf165b798, 0x030e349b,
49 0xd7c45070, 0x25afd373, 0x36ff2087, 0xc494a384,
50 0x9a879fa0, 0x68ec1ca3, 0x7bbcef57, 0x89d76c54,
51 0x5d1d08bf, 0xaf768bbc, 0xbc267848, 0x4e4dfb4b,
52 0x20bd8ede, 0xd2d60ddd, 0xc186fe29, 0x33ed7d2a,
53 0xe72719c1, 0x154c9ac2, 0x061c6936, 0xf477ea35,
54 0xaa64d611, 0x580f5512, 0x4b5fa6e6, 0xb93425e5,
55 0x6dfe410e, 0x9f95c20d, 0x8cc531f9, 0x7eaeb2fa,
56 0x30e349b1, 0xc288cab2, 0xd1d83946, 0x23b3ba45,
57 0xf779deae, 0x05125dad, 0x1642ae59, 0xe4292d5a,
58 0xba3a117e, 0x4851927d, 0x5b016189, 0xa96ae28a,
59 0x7da08661, 0x8fcb0562, 0x9c9bf696, 0x6ef07595,
60 0x417b1dbc, 0xb3109ebf, 0xa0406d4b, 0x522bee48,
61 0x86e18aa3, 0x748a09a0, 0x67dafa54, 0x95b17957,
62 0xcba24573, 0x39c9c670, 0x2a993584, 0xd8f2b687,
63 0x0c38d26c, 0xfe53516f, 0xed03a29b, 0x1f682198,
64 0x5125dad3, 0xa34e59d0, 0xb01eaa24, 0x42752927,
65 0x96bf4dcc, 0x64d4cecf, 0x77843d3b, 0x85efbe38,
66 0xdbfc821c, 0x2997011f, 0x3ac7f2eb, 0xc8ac71e8,
67 0x1c661503, 0xee0d9600, 0xfd5d65f4, 0x0f36e6f7,
68 0x61c69362, 0x93ad1061, 0x80fde395, 0x72966096,
69 0xa65c047d, 0x5437877e, 0x4767748a, 0xb50cf789,
70 0xeb1fcbad, 0x197448ae, 0x0a24bb5a, 0xf84f3859,
71 0x2c855cb2, 0xdeeedfb1, 0xcdbe2c45, 0x3fd5af46,
72 0x7198540d, 0x83f3d70e, 0x90a324fa, 0x62c8a7f9,
73 0xb602c312, 0x44694011, 0x5739b3e5, 0xa55230e6,
74 0xfb410cc2, 0x092a8fc1, 0x1a7a7c35, 0xe811ff36,
75 0x3cdb9bdd, 0xceb018de, 0xdde0eb2a, 0x2f8b6829,
76 0x82f63b78, 0x709db87b, 0x63cd4b8f, 0x91a6c88c,
77 0x456cac67, 0xb7072f64, 0xa457dc90, 0x563c5f93,
78 0x082f63b7, 0xfa44e0b4, 0xe9141340, 0x1b7f9043,
79 0xcfb5f4a8, 0x3dde77ab, 0x2e8e845f, 0xdce5075c,
80 0x92a8fc17, 0x60c37f14, 0x73938ce0, 0x81f80fe3,
81 0x55326b08, 0xa759e80b, 0xb4091bff, 0x466298fc,
82 0x1871a4d8, 0xea1a27db, 0xf94ad42f, 0x0b21572c,
83 0xdfeb33c7, 0x2d80b0c4, 0x3ed04330, 0xccbbc033,
84 0xa24bb5a6, 0x502036a5, 0x4370c551, 0xb11b4652,
85 0x65d122b9, 0x97baa1ba, 0x84ea524e, 0x7681d14d,
86 0x2892ed69, 0xdaf96e6a, 0xc9a99d9e, 0x3bc21e9d,
87 0xef087a76, 0x1d63f975, 0x0e330a81, 0xfc588982,
88 0xb21572c9, 0x407ef1ca, 0x532e023e, 0xa145813d,
89 0x758fe5d6, 0x87e466d5, 0x94b49521, 0x66df1622,
90 0x38cc2a06, 0xcaa7a905, 0xd9f75af1, 0x2b9cd9f2,
91 0xff56bd19, 0x0d3d3e1a, 0x1e6dcdee, 0xec064eed,
92 0xc38d26c4, 0x31e6a5c7, 0x22b65633, 0xd0ddd530,
93 0x0417b1db, 0xf67c32d8, 0xe52cc12c, 0x1747422f,
94 0x49547e0b, 0xbb3ffd08, 0xa86f0efc, 0x5a048dff,
95 0x8ecee914, 0x7ca56a17, 0x6ff599e3, 0x9d9e1ae0,
96 0xd3d3e1ab, 0x21b862a8, 0x32e8915c, 0xc083125f,
97 0x144976b4, 0xe622f5b7, 0xf5720643, 0x07198540,
98 0x590ab964, 0xab613a67, 0xb831c993, 0x4a5a4a90,
99 0x9e902e7b, 0x6cfbad78, 0x7fab5e8c, 0x8dc0dd8f,
100 0xe330a81a, 0x115b2b19, 0x020bd8ed, 0xf0605bee,
101 0x24aa3f05, 0xd6c1bc06, 0xc5914ff2, 0x37faccf1,
102 0x69e9f0d5, 0x9b8273d6, 0x88d28022, 0x7ab90321,
103 0xae7367ca, 0x5c18e4c9, 0x4f48173d, 0xbd23943e,
104 0xf36e6f75, 0x0105ec76, 0x12551f82, 0xe03e9c81,
105 0x34f4f86a, 0xc69f7b69, 0xd5cf889d, 0x27a40b9e,
106 0x79b737ba, 0x8bdcb4b9, 0x988c474d, 0x6ae7c44e,
107 0xbe2da0a5, 0x4c4623a6, 0x5f16d052, 0xad7d5351
108 };
109
110 private int crc = 0;
111
112 @Override
113 public void update(byte b) {
114 crc ^= 0xFFFFFFFF;
115
116 crc = ~((crc >>> 8) ^ CRC_TABLE[(crc ^ b) & 0xFF]);
117 }
118
119 @Override
120 public HashCode hash() {
121 return HashCode.fromInt(crc);
122 }
123 }
124 }