Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Deprecate crc32 and move it into std.hash.crc32.
- Loading branch information
alexrp
authored and
alexrp
committed
Jun 6, 2012
1 parent
1480c79
commit d6c2ef0
Showing
6 changed files
with
152 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
/* | ||
* Copyright (c) 2001, 2002 | ||
* Pavel "EvilOne" Minayev | ||
* Copyright (c) 2012 | ||
* Alex Rønne Petersen | ||
* | ||
* Permission to use, copy, modify, distribute and sell this software | ||
* and its documentation for any purpose is hereby granted without fee, | ||
* provided that the above copyright notice appear in all copies and | ||
* that both that copyright notice and this permission notice appear | ||
* in supporting documentation. Author makes no representations about | ||
* the suitability of this software for any purpose. It is provided | ||
* "as is" without express or implied warranty. | ||
*/ | ||
|
||
/** | ||
Cyclic Redundancy Check (32-bit) implementation. | ||
Macros: | ||
WIKI = StdHashCRC32 | ||
Copyright: Copyright Pavel "EvilOne" Minayev 2001, 2002. Copyright Alex Rønne Petersen 2012. | ||
License: | ||
Permission to use, copy, modify, distribute and sell this software | ||
and its documentation for any purpose is hereby granted without fee, | ||
provided that the above copyright notice appear in all copies and | ||
that both that copyright notice and this permission notice appear | ||
in supporting documentation. Author makes no representations about | ||
the suitability of this software for any purpose. It is provided | ||
"as is" without express or implied warranty. | ||
Authors: Pavel "EvilOne" Minayev, Alex Rønne Petersen | ||
Source: $(PHOBOSSRC std/hash/_crc32.d) | ||
*/ | ||
|
||
// CRC-32 calculation | ||
module std.hash.crc32; | ||
|
||
import std.range; | ||
|
||
@safe: | ||
|
||
private immutable uint[256] crc32_table = | ||
[ | ||
0x00000000,0x77073096,0xee0e612c,0x990951ba,0x076dc419,0x706af48f,0xe963a535, | ||
0x9e6495a3,0x0edb8832,0x79dcb8a4,0xe0d5e91e,0x97d2d988,0x09b64c2b,0x7eb17cbd, | ||
0xe7b82d07,0x90bf1d91,0x1db71064,0x6ab020f2,0xf3b97148,0x84be41de,0x1adad47d, | ||
0x6ddde4eb,0xf4d4b551,0x83d385c7,0x136c9856,0x646ba8c0,0xfd62f97a,0x8a65c9ec, | ||
0x14015c4f,0x63066cd9,0xfa0f3d63,0x8d080df5,0x3b6e20c8,0x4c69105e,0xd56041e4, | ||
0xa2677172,0x3c03e4d1,0x4b04d447,0xd20d85fd,0xa50ab56b,0x35b5a8fa,0x42b2986c, | ||
0xdbbbc9d6,0xacbcf940,0x32d86ce3,0x45df5c75,0xdcd60dcf,0xabd13d59,0x26d930ac, | ||
0x51de003a,0xc8d75180,0xbfd06116,0x21b4f4b5,0x56b3c423,0xcfba9599,0xb8bda50f, | ||
0x2802b89e,0x5f058808,0xc60cd9b2,0xb10be924,0x2f6f7c87,0x58684c11,0xc1611dab, | ||
0xb6662d3d,0x76dc4190,0x01db7106,0x98d220bc,0xefd5102a,0x71b18589,0x06b6b51f, | ||
0x9fbfe4a5,0xe8b8d433,0x7807c9a2,0x0f00f934,0x9609a88e,0xe10e9818,0x7f6a0dbb, | ||
0x086d3d2d,0x91646c97,0xe6635c01,0x6b6b51f4,0x1c6c6162,0x856530d8,0xf262004e, | ||
0x6c0695ed,0x1b01a57b,0x8208f4c1,0xf50fc457,0x65b0d9c6,0x12b7e950,0x8bbeb8ea, | ||
0xfcb9887c,0x62dd1ddf,0x15da2d49,0x8cd37cf3,0xfbd44c65,0x4db26158,0x3ab551ce, | ||
0xa3bc0074,0xd4bb30e2,0x4adfa541,0x3dd895d7,0xa4d1c46d,0xd3d6f4fb,0x4369e96a, | ||
0x346ed9fc,0xad678846,0xda60b8d0,0x44042d73,0x33031de5,0xaa0a4c5f,0xdd0d7cc9, | ||
0x5005713c,0x270241aa,0xbe0b1010,0xc90c2086,0x5768b525,0x206f85b3,0xb966d409, | ||
0xce61e49f,0x5edef90e,0x29d9c998,0xb0d09822,0xc7d7a8b4,0x59b33d17,0x2eb40d81, | ||
0xb7bd5c3b,0xc0ba6cad,0xedb88320,0x9abfb3b6,0x03b6e20c,0x74b1d29a,0xead54739, | ||
0x9dd277af,0x04db2615,0x73dc1683,0xe3630b12,0x94643b84,0x0d6d6a3e,0x7a6a5aa8, | ||
0xe40ecf0b,0x9309ff9d,0x0a00ae27,0x7d079eb1,0xf00f9344,0x8708a3d2,0x1e01f268, | ||
0x6906c2fe,0xf762575d,0x806567cb,0x196c3671,0x6e6b06e7,0xfed41b76,0x89d32be0, | ||
0x10da7a5a,0x67dd4acc,0xf9b9df6f,0x8ebeeff9,0x17b7be43,0x60b08ed5,0xd6d6a3e8, | ||
0xa1d1937e,0x38d8c2c4,0x4fdff252,0xd1bb67f1,0xa6bc5767,0x3fb506dd,0x48b2364b, | ||
0xd80d2bda,0xaf0a1b4c,0x36034af6,0x41047a60,0xdf60efc3,0xa867df55,0x316e8eef, | ||
0x4669be79,0xcb61b38c,0xbc66831a,0x256fd2a0,0x5268e236,0xcc0c7795,0xbb0b4703, | ||
0x220216b9,0x5505262f,0xc5ba3bbe,0xb2bd0b28,0x2bb45a92,0x5cb36a04,0xc2d7ffa7, | ||
0xb5d0cf31,0x2cd99e8b,0x5bdeae1d,0x9b64c2b0,0xec63f226,0x756aa39c,0x026d930a, | ||
0x9c0906a9,0xeb0e363f,0x72076785,0x05005713,0x95bf4a82,0xe2b87a14,0x7bb12bae, | ||
0x0cb61b38,0x92d28e9b,0xe5d5be0d,0x7cdcefb7,0x0bdbdf21,0x86d3d2d4,0xf1d4e242, | ||
0x68ddb3f8,0x1fda836e,0x81be16cd,0xf6b9265b,0x6fb077e1,0x18b74777,0x88085ae6, | ||
0xff0f6a70,0x66063bca,0x11010b5c,0x8f659eff,0xf862ae69,0x616bffd3,0x166ccf45, | ||
0xa00ae278,0xd70dd2ee,0x4e048354,0x3903b3c2,0xa7672661,0xd06016f7,0x4969474d, | ||
0x3e6e77db,0xaed16a4a,0xd9d65adc,0x40df0b66,0x37d83bf0,0xa9bcae53,0xdebb9ec5, | ||
0x47b2cf7f,0x30b5ffe9,0xbdbdf21c,0xcabac28a,0x53b39330,0x24b4a3a6,0xbad03605, | ||
0xcdd70693,0x54de5729,0x23d967bf,0xb3667a2e,0xc4614ab8,0x5d681b02,0x2a6f2b94, | ||
0xb40bbe37,0xc30c8ea1,0x5a05df1b,0x2d02ef8d | ||
]; | ||
|
||
/** | ||
* The initial value of a CRC32 computation. | ||
*/ | ||
enum uint crc32Init = uint.max; | ||
|
||
/** | ||
* Updates a given CRC32 value with the given byte value. | ||
* | ||
* Params: | ||
* crc = The current CRC32 value. | ||
* val = The value to add to the CRC32 computation. | ||
*/ | ||
uint updateCRC32(T)(uint crc, T val) pure nothrow | ||
if (is(T == ubyte) || is(T == byte)) | ||
{ | ||
return crc32_table[cast(ubyte)crc ^ cast(ubyte)val] ^ (crc >> 8); | ||
} | ||
|
||
/** | ||
* Computes the CRC32 value of a given range of bytes. | ||
* | ||
* Params: | ||
* range = The range to compute a CRC32 value for. | ||
*/ | ||
uint rangeToCRC32(R)(in R range) pure nothrow | ||
if (isInputRange!R && (is(ElementType!R == byte) || is(ElementType!R == ubyte))) | ||
{ | ||
uint crc = crc32Init; | ||
|
||
foreach (val; range) | ||
crc = updateCRC32!(ElementType!R)(crc, val); | ||
|
||
return crc; | ||
} | ||
|
||
unittest | ||
{ | ||
ubyte[] bytes1 = [1, 2, 3]; | ||
byte[] bytes2 = [1, 2, 3]; | ||
|
||
rangeToCRC32(bytes1); // ensure that we can call with ubyte[] | ||
rangeToCRC32(bytes2); // ensure that we can call with byte[] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters