Geant4 Cross Reference |
1 // -*- C++ -*- 1 // -*- C++ -*- 2 // 2 // 3 // ------------------------------------------- 3 // ----------------------------------------------------------------------- 4 // HEP Random 4 // HEP Random 5 // --- engineIDulong --- 5 // --- engineIDulong --- 6 // function implementatio 6 // function implementation file 7 // ------------------------------------------- 7 // ----------------------------------------------------------------------- 8 // 8 // 9 // =========================================== 9 // ======================================================================= 10 // Mark Fischler - Created: Mar. 8, 2005 10 // Mark Fischler - Created: Mar. 8, 2005 11 // =========================================== 11 // ======================================================================= 12 12 13 #include <string> 13 #include <string> 14 #include <vector> 14 #include <vector> 15 15 16 namespace CLHEP { 16 namespace CLHEP { 17 17 18 static std::vector<unsigned long> gen_crc_tabl 18 static std::vector<unsigned long> gen_crc_table() { 19 /* generate the table of CRC remainders for 19 /* generate the table of CRC remainders for all possible bytes */ 20 static const unsigned long POLYNOMIAL = 0x04 20 static const unsigned long POLYNOMIAL = 0x04c11db7UL; 21 std::vector<unsigned long> crc_table; 21 std::vector<unsigned long> crc_table; 22 for ( unsigned long i = 0; i < 256; ++i ) 22 for ( unsigned long i = 0; i < 256; ++i ) { 23 unsigned long crc = i << 24; 23 unsigned long crc = i << 24; 24 for ( int j = 0; j < 8; j++ ) { 24 for ( int j = 0; j < 8; j++ ) { 25 if ( crc & 0x80000000UL ) { 25 if ( crc & 0x80000000UL ) { 26 crc = ( ( crc << 1 ) ^ POLYNOMIAL ) & 26 crc = ( ( crc << 1 ) ^ POLYNOMIAL ) & 0xffffffffUL; 27 } else { 27 } else { 28 crc = ( crc << 1 ) & 0xffffffffUL; 28 crc = ( crc << 1 ) & 0xffffffffUL; 29 } 29 } 30 } 30 } 31 crc_table.push_back(crc); 31 crc_table.push_back(crc); 32 } 32 } 33 return crc_table; 33 return crc_table; 34 } 34 } 35 35 36 unsigned long crc32ul(const std::string & s) { 36 unsigned long crc32ul(const std::string & s) { 37 static const std::vector<unsigned long> crc_ 37 static const std::vector<unsigned long> crc_table = gen_crc_table(); 38 unsigned long crc = 0; 38 unsigned long crc = 0; 39 unsigned long end = s.length(); << 39 int end = s.length(); 40 for (unsigned long j = 0; j != end; ++j) { << 40 for (int j = 0; j != end; ++j) { 41 int i = ( (int) ( crc >> 24) ^ s[j] ) & 0x 41 int i = ( (int) ( crc >> 24) ^ s[j] ) & 0xff; 42 crc = ( ( crc << 8 ) ^ crc_table[i] ) & 0x 42 crc = ( ( crc << 8 ) ^ crc_table[i] ) & 0xffffffffUL; 43 } 43 } 44 return crc; 44 return crc; 45 } 45 } 46 46 47 } // namespace CLHEP 47 } // namespace CLHEP 48 48 49 49