ewmscp  ..
adler32.cpp
Go to the documentation of this file.
1 #include "adler32.h"
2 #include "block.h"
3 #include <iomanip>
4 #include <iostream>
5 #include <sstream>
6 #include <vector>
7 #include <zlib.h>
8 
9 namespace checksum {
10  decltype(adler32::factory) adler32::factory("adler32");
11  adler32::adler32(const std::string& aName): base(aName) {
12  adler = ::adler32(0, Z_NULL, 0);
13  }
14  void adler32::update(void *data, size_t size) {
15  adler = ::adler32(adler, reinterpret_cast<const unsigned char*>(data), size);
16  }
17 
18  void adler32::update(size_t size) { // case for block of zeroes
19  auto A = adler & 0x0000ffff;
20  auto B = adler >> 16;
21  B = (B + A * size ) % 65521;
22  adler = A | (B << 16);
23  }
24 
25  void adler32::finish() {
26  std::ostringstream hashBuffer;
27  hashBuffer << std::hex << std::setw(2 * 4) << std::setfill('0') << adler;
28  result = hashBuffer.str();
29  }
30 
31 
32  bool adler32::parallelizable() const {
33  return true;
34  }
35  void adler32::update(void *data, size_t size, size_t offset) {
36  auto part = ::adler32(adler,
37  reinterpret_cast<const unsigned char*>(data),
38  size);
39  std::lock_guard<decltype(partialSumsMutex)> lock(partialSumsMutex);
40  partialSums.emplace(offset, std::pair<uint32_t, size_t>(part, size));
41  }
42  void adler32::update(size_t size, size_t offset) {
43  auto A = adler & 0x0000ffff;
44  auto B = adler >> 16;
45  B = (B + A * size ) % 65521;
46  std::lock_guard<decltype(partialSumsMutex)> lock(partialSumsMutex);
47  partialSums.emplace(offset, std::pair<uint32_t, size_t>( A | (B << 16), size));
48  }
50  std::lock_guard<decltype(partialSumsMutex)> lock(partialSumsMutex);
51  for (auto& item : partialSums) {
52  adler = ::adler32_combine(adler, item.second.first, item.second.second);
53  }
54  finish();
55  }
56 
57 
58 
59  decltype(adler32noOpt::factory) adler32noOpt::factory("adler32noOpt");
60  adler32noOpt::adler32noOpt(const std::string& aName): adler32(aName) {}
61 
62  void adler32noOpt::update(void *data, size_t size) {
63  adler = ::adler32(adler, reinterpret_cast<const unsigned char*>(data), size);
64  }
65  void adler32noOpt::update(size_t size) { // case for block of zeroes
66  for (size_t bytes_done = 0; bytes_done < size;) {
67  auto missing = size - bytes_done;
68  size_t bytes = std::min(missing, block::nullBufferSize());
69 
70  adler = ::adler32(adler, static_cast<const unsigned char*>(block::nullBuffer()), bytes);
71  bytes_done += bytes;
72  }
73  }
74 
75  void adler32noOpt::update(void *data, size_t size, size_t offset) {
76  auto part = ::adler32(adler,
77  reinterpret_cast<const unsigned char*>(data),
78  size);
79  std::lock_guard<decltype(partialSumsMutex)> lock(partialSumsMutex);
80  partialSums.emplace(offset, std::pair<uint32_t, size_t>(part, size));
81  }
82  void adler32noOpt::update(size_t size, size_t offset) {
83  auto part = adler;
84  for (size_t bytes_done = 0; bytes_done < size;) {
85  auto missing = size - bytes_done;
86  size_t bytes = std::min(missing, block::nullBufferSize());
87 
88  part = ::adler32(part, static_cast<const unsigned char*>(block::nullBuffer()), bytes);
89  bytes_done += bytes;
90  }
91  std::lock_guard<decltype(partialSumsMutex)> lock(partialSumsMutex);
92  partialSums.emplace(offset, std::pair<uint32_t, size_t>(part, size));
93  }
94 
95 
96 
97  decltype(crc32::factory) crc32::factory("crc32");
98  crc32::crc32(const std::string& aName): base(aName) {
99  crc = ::crc32(0, Z_NULL, 0);
100  }
101  void crc32::update(void *data, size_t size) {
102  crc = ::crc32(crc, reinterpret_cast<const unsigned char*>(data), size);
103  }
104 
105  void crc32::update(size_t size) { // case for block of zeroes
106  for (size_t bytes_done = 0; bytes_done < size;) {
107  auto missing = size - bytes_done;
108  size_t bytes = std::min(missing, block::nullBufferSize());
109 
110  crc = ::crc32(crc, static_cast<const unsigned char*>(block::nullBuffer()), bytes);
111  bytes_done += bytes;
112  }
113  }
114 
115  void crc32::finish() {
116  std::ostringstream hashBuffer;
117  hashBuffer << std::hex << std::setw(2 * 4) << std::setfill('0') << crc;
118  result = hashBuffer.str();
119  }
120 
121  bool crc32::parallelizable() const {
122  return true;
123  }
124  void crc32::update(void *data, size_t size, size_t offset) {
125  auto part =::crc32(crc,
126  reinterpret_cast<const unsigned char*>(data),
127  size);
128  std::lock_guard<decltype(partialSumsMutex)> lock(partialSumsMutex);
129  partialSums.emplace(offset, std::pair<uint32_t, size_t>(part, size));
130  }
131 
132  void crc32::update(size_t size, size_t offset) { // case for block of zeroes
133  auto part = crc;
134  for (size_t bytes_done = 0; bytes_done < size;) {
135  auto missing = size - bytes_done;
136  size_t bytes = std::min(missing, block::nullBufferSize());
137 
138  part = ::crc32(part, static_cast<const unsigned char*>(block::nullBuffer()), bytes);
139  bytes_done += bytes;
140  }
141  std::lock_guard<decltype(partialSumsMutex)> lock(partialSumsMutex);
142  partialSums.emplace(offset, std::pair<uint32_t, size_t>(part, size));
143  }
145  std::lock_guard<decltype(partialSumsMutex)> lock(partialSumsMutex);
146  for (auto& item : partialSums) {
147  crc = ::crc32_combine(crc, item.second.first, item.second.second);
148  }
149  finish();
150  }
151 
152 }; // end namespace checksum
block.h
checksum::crc32::update
void update(void *data, size_t size) override
proces size bytes in the block at data
Definition: adler32.cpp:101
checksum::crc32::parallelFinish
void parallelFinish() override
Definition: adler32.cpp:144
checksum::adler32noOpt::factory
static factoryTemplate< adler32noOpt > factory
Definition: adler32.h:34
checksum::adler32::partialSumsMutex
std::mutex partialSumsMutex
Definition: adler32.h:17
checksum::adler32noOpt::update
void update(void *data, size_t size) override
proces size bytes in the block at data
Definition: adler32.cpp:62
checksum::adler32::adler32
adler32(const std::string &name)
Definition: adler32.cpp:11
block::nullBuffer
static const void * nullBuffer()
Definition: block.cpp:37
checksum::adler32::parallelFinish
void parallelFinish() override
Definition: adler32.cpp:49
checksum::adler32
class to calculate adler32 sum.
Definition: adler32.h:12
checksum::crc32::crc32
crc32(const std::string &name)
Definition: adler32.cpp:98
checksum::base
Definition: checksumBase.h:8
checksum::crc32::crc
uint32_t crc
Definition: adler32.h:48
checksum::adler32::update
void update(void *data, size_t size) override
proces size bytes in the block at data
Definition: adler32.cpp:14
checksum::adler32::factory
static factoryTemplate< adler32 > factory
Definition: adler32.h:14
checksum::crc32::partialSumsMutex
std::mutex partialSumsMutex
Definition: adler32.h:49
checksum::crc32::parallelizable
bool parallelizable() const override
Definition: adler32.cpp:121
adler32.h
checksum::crc32::partialSums
std::map< size_t, std::pair< uint32_t, size_t > > partialSums
Definition: adler32.h:50
block::nullBufferSize
static size_t nullBufferSize()
Definition: block.cpp:34
checksum::crc32::finish
void finish() override
finish calculation ad write to result
Definition: adler32.cpp:115
checksum::adler32::adler
uint32_t adler
Definition: adler32.h:16
checksum::adler32::finish
void finish() override
finish calculation ad write to result
Definition: adler32.cpp:25
checksum::adler32noOpt::adler32noOpt
adler32noOpt(const std::string &name)
Definition: adler32.cpp:60
checksum::base::result
std::string result
Definition: checksumBase.h:38
checksum::adler32::parallelizable
bool parallelizable() const override
Definition: adler32.cpp:32
checksum::adler32::partialSums
std::map< size_t, std::pair< uint32_t, size_t > > partialSums
Definition: adler32.h:18
checksum::crc32::factory
static factoryTemplate< crc32 > factory
Definition: adler32.h:46
checksum
Definition: adler32.cpp:9