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