#include "hash.h" #include "crc32.h" #include #include 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."); } void _hash_file(int fileno, Hash* hash) { char* buf = new char[131072]; int s; while((s = read(fileno, buf, 131072)) > 0) { hash->_update(buf, s); } delete buf; } }