00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include <string>
00015 #include <vector>
00016
00017 namespace CLHEP {
00018
00019 static std::vector<unsigned long> gen_crc_table() {
00020
00021 static const unsigned long POLYNOMIAL = 0x04c11db7UL;
00022 std::vector<unsigned long> crc_table;
00023 for ( unsigned long i = 0; i < 256; ++i ) {
00024 unsigned long crc = i << 24;
00025 for ( int j = 0; j < 8; j++ ) {
00026 if ( crc & 0x80000000UL ) {
00027 crc = ( ( crc << 1 ) ^ POLYNOMIAL ) & 0xffffffffUL;
00028 } else {
00029 crc = ( crc << 1 ) & 0xffffffffUL;
00030 }
00031 }
00032 crc_table.push_back(crc);
00033 }
00034 return crc_table;
00035 }
00036
00037 unsigned long crc32ul(const std::string & s) {
00038 static std::vector<unsigned long> crc_table = gen_crc_table();
00039 unsigned long crc = 0;
00040 int end = s.length();
00041 for (int j = 0; j != end; ++j) {
00042 int i = ( (int) ( crc >> 24) ^ s[j] ) & 0xff;
00043 crc = ( ( crc << 8 ) ^ crc_table[i] ) & 0xffffffffUL;
00044 }
00045 return crc;
00046 }
00047
00048 }
00049