summaryrefslogtreecommitdiff
path: root/src/crc32.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/crc32.cpp')
-rw-r--r--src/crc32.cpp73
1 files changed, 41 insertions, 32 deletions
diff --git a/src/crc32.cpp b/src/crc32.cpp
index 55d6dd2..6623166 100644
--- a/src/crc32.cpp
+++ b/src/crc32.cpp
@@ -1,41 +1,50 @@
#include "crc32.h"
-int* CRC32::crc_table;
-
-int* CRC32::generate_table() {
- int crc;
- int* table = new int[256];
- for(int i = 0; i < 256; i++) {
- crc = i << 24;
- for(int j = 0; j < 8; j++) {
- if(crc & 0x80000000) {
- crc = (crc << 1) ^ 0x04c11db7;
- } else {
- crc = crc << 1;
+namespace Multihash {
+ int* crc_table = 0;
+
+ void generate_table() {
+ int crc;
+ crc_table = new int[256];
+ for(int i = 0; i < 256; i++) {
+ crc = i << 24;
+ for(int j = 0; j < 8; j++) {
+ if(crc & 0x80000000) {
+ crc = (crc << 1) ^ 0x04c11db7;
+ } else {
+ crc = crc << 1;
+ }
}
+ crc_table[i] = crc;
}
- table[i] = crc;
}
- return table;
-}
-
-int CRC32::reflect(int data, int bits) {
- int x = 0;
- for(int i = 0; i < bits; i++) {
- x = x << 1;
- x |= data & 1;
- data = data >> 1;
+
+ int reflect(int data, int bits) {
+ int x = 0;
+ for(int i = 0; i < bits; i++) {
+ x = x << 1;
+ x |= data & 1;
+ data = data >> 1;
+ }
+ return x;
}
- return x;
-}
-
-int CRC32::crc32(int crc, const char* data, int length) {
- crc = ~reflect(crc, 32);
- if(!crc_table) {
- crc_table = generate_table();
+
+ CRC32::CRC32(Hash* n) : Hash(n) {
+ if(!crc_table) {
+ generate_table();
+ }
+ crc_ctx = 0;
+ }
+
+ void CRC32::hash_update(const char* data, int length) {
+ int crc = ~reflect(crc_ctx, 32);
+ for (int i = 0; i < length; i++) {
+ crc = (crc << 8) ^ crc_table[((crc >> 24) ^ reflect(data[i], 8)) & 0xff];
+ }
+ crc_ctx = ~reflect(crc, 32);
}
- for (int i = 0; i < length; i++) {
- crc = (crc << 8) ^ crc_table[((crc >> 24) ^ reflect(data[i], 8)) & 0xff];
+
+ std::string CRC32::hash_digest() {
+ return Hex::hex(crc_ctx);
}
- return ~reflect(crc, 32);
}