/************************************************************************* ** HashFunction.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2024 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "HashFunction.hpp" #include "utility.hpp" #include "MD5HashFunction.hpp" #include "XXHashFunction.hpp" using namespace std; /** Returns a vector containing the names of the currently supported hash algorithms. */ vector HashFunction::supportedAlgorithms () { return vector { "md5", "xxh32", "xxh64", #ifdef ENABLE_XXH128 "xxh128" #endif }; } /** Returns true if 'algo' is the name of a supported hash algorithm. */ bool HashFunction::isSupportedAlgorithm (const std::string &algo) { auto algos = supportedAlgorithms(); return find(algos.begin(), algos.end(), algo) != algos.end(); } /** Creates a hash function for a given algorithm name/identifier. * The following names are currently supported: md5, xxh32, xxh64. */ unique_ptr HashFunction::create (const string &name) { string lowerName = util::tolower(name); if (lowerName == "md5") return util::make_unique(); if (lowerName == "xxh32") return util::make_unique(); if (lowerName == "xxh64") return util::make_unique(); #ifdef ENABLE_XXH128 if (lowerName == "xxh128") return util::make_unique(); #endif return nullptr; } std::unique_ptr HashFunction::create (const string &name, const char *data, size_t length) { auto hashfunc = create(name); if (hashfunc) hashfunc->update(data, length); return hashfunc; } std::unique_ptr HashFunction::create (const string &name, const string &data) { return create(name, data.data(), data.length()); } std::unique_ptr HashFunction::create (const string &name, const vector &data) { return create(name, reinterpret_cast(data.data()), data.size()); } void HashFunction::update (istream &is) { char buf[4096]; while (is) { is.read(buf, 4096); update(buf, is.gcount()); } } /** Returns the current digest as hexadecimal value. */ string HashFunction::digestString () const { ostringstream oss; oss << hex << setfill('0'); for (int byte : digestBytes()) oss << setw(2) << byte; return oss.str(); }