blob: 89b14cc48272ebce9c0777cf2bef03c9b8b5a1f5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
#include "hash.h"
#include "crc32.h"
#include <stdexcept>
#include <iostream>
namespace Multihash {
namespace Hex {
static char* digits = "0123456789abcdef";
std::string hex(char* bin, int length) {
std::string s(length * 2, ' ');
for(int i = 0; i < length; i++) {
s[i*2] = digits[(bin[i] >> 4) & 0xf];
s[i*2+1] = digits[bin[i] & 0xf];
}
return s;
}
std::string hex(int bin) {
std::string s(sizeof(int) * 2, ' ');
for(int i = 0; i < sizeof(int) * 2; i++) {
s[sizeof(int) * 2 - 1 - i] = digits[bin & 0xf];
bin = bin >> 4;
}
return s;
}
}
Hash::Hash(Hash* n) {
digest_str = "";
next = n;
}
void Hash::update(std::string data) {
const char* buf = data.c_str();
int len = data.length();
this->_update(buf, len);
}
void Hash::_update(const char* data, int length) {
if(digest_str.length()) {
throw std::runtime_error("Can't update after digest.");
}
this->hash_update(data, length);
if(next) {
next->_update(data, length);
}
}
std::string Hash::digest() {
if(!digest_str.length()) {
digest_str = this->hash_digest();
}
return digest_str;
}
void Hash::hash_update(const char* data, int length) {
throw std::runtime_error("Not implemented.");
}
std::string Hash::hash_digest() {
throw std::runtime_error("Not implemented.");
}
}
|