Monday, July 10, 2017

boost sha1 の出力と python の hashlib の出力を比較しながら使いたい場合

先日, 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()