diff --git a/common/include/villas/utils.hpp b/common/include/villas/utils.hpp index f39b58737..7b757e70a 100644 --- a/common/include/villas/utils.hpp +++ b/common/include/villas/utils.hpp @@ -36,6 +36,8 @@ #include #include +#include +#include #include #include @@ -200,6 +202,12 @@ size_t strlenp(const char *str); */ int sha1sum(FILE *f, unsigned char *sha1); +/** Generate an UUID by MD5 hashing the provided string */ +void uuid_generate_from_str(uuid_t out, const std::string &data, const std::string &ns = ""); + +/** Generate an UUID by MD5 hashing the serialized representation of the provided JSON object */ +void uuid_generate_from_json(uuid_t out, json_t *json, const std::string &ns = ""); + namespace base64 { using byte = std::uint8_t; diff --git a/common/lib/utils.cpp b/common/lib/utils.cpp index fa95a9a80..6c6ecbbf6 100644 --- a/common/lib/utils.cpp +++ b/common/lib/utils.cpp @@ -1,6 +1,7 @@ /** Utilities. * * @author Daniel Krebs + * @author Steffen Vogel * @copyright 2014-2020, Institute for Automation of Complex Power Systems, EONERC * @license GNU General Public License (version 3) * @@ -38,6 +39,9 @@ #include #include #include +#include +#include +#include #include #include @@ -353,5 +357,26 @@ int sha1sum(FILE *f, unsigned char *sha1) return 0; } +void uuid_generate_from_str(uuid_t out, const std::string &data, const std::string &ns) +{ + std::stringstream ss; + + if (!ns.empty()) + ss << ns << "|"; + + ss << data; + + MD5((unsigned char*) ss.str().c_str(), ss.str().size(), (unsigned char *) &out); +} + +void uuid_generate_from_json(uuid_t out, json_t *json, const std::string &ns) +{ + char *str = json_dumps(json, JSON_COMPACT | JSON_SORT_KEYS); + + uuid_generate_from_str(out, str, ns); + + free(str); +} + } /* namespace utils */ } /* namespace villas */