C++ boostを使用してSHA-1 ハッシュ値の計算 メモ
C++ Boost.Uuidのdetailにあるsha1クラスを用いてSHA-1 ハッシュ値を計算する方法のメモです。
SHA-1の場合ハッシュ値は20バイト固定なのでboost::array<boost::uint8_t,20>を返すような関数を作りました。
main.cpp
#include <boost/uuid/sha1.hpp> #include <boost/cstdint.hpp> #include <boost/array.hpp> #include <iostream> typedef boost::array<boost::uint8_t,20> hash_data_t; hash_data_t get_sha1_hash( const void *data, const std::size_t byte_count ) { boost::uuids::detail::sha1 sha1; sha1.process_bytes( data, byte_count ); unsigned int digest[5]; sha1.get_digest( digest ); const boost::uint8_t *p_digest = reinterpret_cast<const boost::uint8_t *>( digest ); hash_data_t hash_data; for( int i = 0; i < 5; ++i ) { hash_data[ i * 4 ] = p_digest[ i * 4 + 3 ]; hash_data[ i * 4 + 1 ] = p_digest[ i * 4 + 2 ]; hash_data[ i * 4 + 2 ] = p_digest[ i * 4 + 1 ]; hash_data[ i * 4 + 3 ] = p_digest[ i * 4 ]; } return hash_data; } int main() { std::cout << std::hex; hash_data_t hash = get_sha1_hash( "foobar", 6 ); hash_data_t::const_iterator itr = hash.begin(); const hash_data_t::const_iterator end_itr = hash.end(); for( ; itr != end_itr; ++itr ) { std::cout << ( (*itr & 0xf0 ) >> 4 ) << (*itr & 0x0f ); } std::cout << std::endl; return 0; }
出力
8843d7f92416211de9ebb963ff4ce28125932878
下のサイトでチェックしたところ同じ値がでました。
SHA1 Hash Generator » Joe's Web Tools
参考
SHA - Wikipedia
SHA-1 With Boost
BoostでSHA-1 - Faith and Brave - C++で遊ぼう