#include "../include/Hash.hpp" #include "../include/bin2hex.hpp" #include #include #include namespace odhtdb { struct SodiumInitializer { SodiumInitializer() { if(sodium_init() < 0) throw std::runtime_error("Failed to initialize libsodium"); } }; static SodiumInitializer __sodiumInitializer; // Source: https://stackoverflow.com/a/11414104 (public license) static size_t fnvHash(const unsigned char *key, int len) { size_t h = 2166136261; for (int i = 0; i < len; i++) h = (h * 16777619) ^ key[i]; return h; } Hash::Hash() { memset(data, 0, HASH_BYTE_SIZE); } Hash::Hash(const void *input, const size_t inputSize) { int result = crypto_generichash_blake2b((unsigned char*)data, HASH_BYTE_SIZE, (const unsigned char*)input, inputSize, nullptr, 0); if(result < 0) throw HashException("Failed to hash data using blake2b"); } size_t Hash::operator()() const { return fnvHash((const unsigned char*)data, HASH_BYTE_SIZE); } bool Hash::operator==(const Hash &other) const { return memcmp(data, other.data, HASH_BYTE_SIZE) == 0; } std::string Hash::toString() const { return bin2hex(data, HASH_BYTE_SIZE); } }