Program Listing for File sha256_file.hpp

Return to documentation for file (include/dish2/utility/sha256_file.hpp)

#pragma once
#ifndef DISH2_UTILITY_SHA256_FILE_HPP_INCLUDE
#define DISH2_UTILITY_SHA256_FILE_HPP_INCLUDE

#include <cstddef>
#include <cstring>
#include <streambuf>

#include "../../../third-party/Empirical/include/emp/base/array.hpp"
#include "../../../third-party/PicoSHA2/picosha2.h"

#include "BytewiseIterator.hpp"

namespace dish2 {

template<typename H>
uint32_t sha256_file(H handle) {

  // we'll use first sizeof( uint32_t ) bytes as the result
  static_assert( picosha2::k_digest_size >= sizeof( uint32_t ) );

  emp::array<unsigned char, picosha2::k_digest_size> hash;

  picosha2::hash256(
    std::istreambuf_iterator<char>(handle), std::istreambuf_iterator<char>(),
    std::begin( hash ), std::end( hash )
  );

  uint32_t res;
  std::memcpy( &res, hash.data(), sizeof( uint32_t ) );

  return res;

}

} // namespace dish2

#endif // #ifndef DISH2_UTILITY_SHA256_FILE_HPP_INCLUDE