ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
engineIDulong.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file engineIDulong.cc
1 // -*- C++ -*-
2 //
3 // -----------------------------------------------------------------------
4 // HEP Random
5 // --- engineIDulong ---
6 // function implementation file
7 // -----------------------------------------------------------------------
8 //
9 // =======================================================================
10 // Mark Fischler - Created: Mar. 8, 2005
11 // =======================================================================
12 
13 #include <string>
14 #include <vector>
15 
16 namespace CLHEP {
17 
18 static std::vector<unsigned long> gen_crc_table() {
19  /* generate the table of CRC remainders for all possible bytes */
20  static const unsigned long POLYNOMIAL = 0x04c11db7UL;
21  std::vector<unsigned long> crc_table;
22  for ( unsigned long i = 0; i < 256; ++i ) {
23  unsigned long crc = i << 24;
24  for ( int j = 0; j < 8; j++ ) {
25  if ( crc & 0x80000000UL ) {
26  crc = ( ( crc << 1 ) ^ POLYNOMIAL ) & 0xffffffffUL;
27  } else {
28  crc = ( crc << 1 ) & 0xffffffffUL;
29  }
30  }
31  crc_table.push_back(crc);
32  }
33  return crc_table;
34 }
35 
36 unsigned long crc32ul(const std::string & s) {
37  static const std::vector<unsigned long> crc_table = gen_crc_table();
38  unsigned long crc = 0;
39  int end = s.length();
40  for (int j = 0; j != end; ++j) {
41  int i = ( (int) ( crc >> 24) ^ s[j] ) & 0xff;
42  crc = ( ( crc << 8 ) ^ crc_table[i] ) & 0xffffffffUL;
43  }
44  return crc;
45 }
46 
47 } // namespace CLHEP
48