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++で遊ぼう