先日, sha1 ダイジェストを C++ (boost) と python の両方で使いたいということがありました。通常 1 つの言語だけで実装する場合には配列の中身さえ同じならばいいのですが,私の利用方法では 2 つの実装のからの出力が一致する必要がありました。このコードはその問題を避けていますので,もし,こういう利用方法をされる場合には参考になるかと思います。(単純にフォーマットをそろえているだけです。)
#include <boost/uuid/sha1.hpp>
/// get sha1 digest as a std::string
///
/// \param[in] mes message to be hashed
/// \return digest string
std::string get_sha1_digest(const std::string& mes)
{
boost::uuids::detail::sha1 sha1;
sha1.process_bytes(mes.c_str(), mes.size());
const int DIGEST_SIZE = 5;
unsigned int sha1_hash[DIGEST_SIZE];
sha1.get_digest(sha1_hash);
std::stringstream sstr;
for (std::size_t i=0; i < DIGEST_SIZE; ++i)
{
sstr << std::setfill('0') << std::setw(8) << std::hex << sha1_hash[i];
}
return sstr.str();
}
上記の関数の出力は,次の python code の出力に一致します。
import hashlib
def get_sha1_digest(mes):
sha1_obj = hashlib.sha1(mes.encode())
return sha1_obj.hexdigest()
Comments
Post a Comment