summaryrefslogtreecommitdiff
path: root/src/hash.cpp
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.");
	}
}