Split off hash.h from util.h
This commit is contained in:
parent
6940626d08
commit
0fb9073edd
7 changed files with 121 additions and 107 deletions
|
@ -144,6 +144,7 @@ HEADERS += src/qt/bitcoingui.h \
|
||||||
src/compat.h \
|
src/compat.h \
|
||||||
src/sync.h \
|
src/sync.h \
|
||||||
src/util.h \
|
src/util.h \
|
||||||
|
src/hash.h \
|
||||||
src/uint256.h \
|
src/uint256.h \
|
||||||
src/serialize.h \
|
src/serialize.h \
|
||||||
src/main.h \
|
src/main.h \
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
#include "addrman.h"
|
#include "addrman.h"
|
||||||
|
#include "hash.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
116
src/hash.h
Normal file
116
src/hash.h
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||||
|
// Copyright (c) 2009-2012 The Bitcoin developers
|
||||||
|
// Distributed under the MIT/X11 software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
#ifndef BITCOIN_HASH_H
|
||||||
|
#define BITCOIN_HASH_H
|
||||||
|
|
||||||
|
#include "uint256.h"
|
||||||
|
#include "serialize.h"
|
||||||
|
|
||||||
|
#include <openssl/sha.h>
|
||||||
|
#include <openssl/ripemd.h>
|
||||||
|
|
||||||
|
template<typename T1>
|
||||||
|
inline uint256 Hash(const T1 pbegin, const T1 pend)
|
||||||
|
{
|
||||||
|
static unsigned char pblank[1];
|
||||||
|
uint256 hash1;
|
||||||
|
SHA256((pbegin == pend ? pblank : (unsigned char*)&pbegin[0]), (pend - pbegin) * sizeof(pbegin[0]), (unsigned char*)&hash1);
|
||||||
|
uint256 hash2;
|
||||||
|
SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
|
||||||
|
return hash2;
|
||||||
|
}
|
||||||
|
|
||||||
|
class CHashWriter
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
SHA256_CTX ctx;
|
||||||
|
|
||||||
|
public:
|
||||||
|
int nType;
|
||||||
|
int nVersion;
|
||||||
|
|
||||||
|
void Init() {
|
||||||
|
SHA256_Init(&ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
CHashWriter(int nTypeIn, int nVersionIn) : nType(nTypeIn), nVersion(nVersionIn) {
|
||||||
|
Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
CHashWriter& write(const char *pch, size_t size) {
|
||||||
|
SHA256_Update(&ctx, pch, size);
|
||||||
|
return (*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
// invalidates the object
|
||||||
|
uint256 GetHash() {
|
||||||
|
uint256 hash1;
|
||||||
|
SHA256_Final((unsigned char*)&hash1, &ctx);
|
||||||
|
uint256 hash2;
|
||||||
|
SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
|
||||||
|
return hash2;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
CHashWriter& operator<<(const T& obj) {
|
||||||
|
// Serialize to this stream
|
||||||
|
::Serialize(*this, obj, nType, nVersion);
|
||||||
|
return (*this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T1, typename T2>
|
||||||
|
inline uint256 Hash(const T1 p1begin, const T1 p1end,
|
||||||
|
const T2 p2begin, const T2 p2end)
|
||||||
|
{
|
||||||
|
static unsigned char pblank[1];
|
||||||
|
uint256 hash1;
|
||||||
|
SHA256_CTX ctx;
|
||||||
|
SHA256_Init(&ctx);
|
||||||
|
SHA256_Update(&ctx, (p1begin == p1end ? pblank : (unsigned char*)&p1begin[0]), (p1end - p1begin) * sizeof(p1begin[0]));
|
||||||
|
SHA256_Update(&ctx, (p2begin == p2end ? pblank : (unsigned char*)&p2begin[0]), (p2end - p2begin) * sizeof(p2begin[0]));
|
||||||
|
SHA256_Final((unsigned char*)&hash1, &ctx);
|
||||||
|
uint256 hash2;
|
||||||
|
SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
|
||||||
|
return hash2;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T1, typename T2, typename T3>
|
||||||
|
inline uint256 Hash(const T1 p1begin, const T1 p1end,
|
||||||
|
const T2 p2begin, const T2 p2end,
|
||||||
|
const T3 p3begin, const T3 p3end)
|
||||||
|
{
|
||||||
|
static unsigned char pblank[1];
|
||||||
|
uint256 hash1;
|
||||||
|
SHA256_CTX ctx;
|
||||||
|
SHA256_Init(&ctx);
|
||||||
|
SHA256_Update(&ctx, (p1begin == p1end ? pblank : (unsigned char*)&p1begin[0]), (p1end - p1begin) * sizeof(p1begin[0]));
|
||||||
|
SHA256_Update(&ctx, (p2begin == p2end ? pblank : (unsigned char*)&p2begin[0]), (p2end - p2begin) * sizeof(p2begin[0]));
|
||||||
|
SHA256_Update(&ctx, (p3begin == p3end ? pblank : (unsigned char*)&p3begin[0]), (p3end - p3begin) * sizeof(p3begin[0]));
|
||||||
|
SHA256_Final((unsigned char*)&hash1, &ctx);
|
||||||
|
uint256 hash2;
|
||||||
|
SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
|
||||||
|
return hash2;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
uint256 SerializeHash(const T& obj, int nType=SER_GETHASH, int nVersion=PROTOCOL_VERSION)
|
||||||
|
{
|
||||||
|
CHashWriter ss(nType, nVersion);
|
||||||
|
ss << obj;
|
||||||
|
return ss.GetHash();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline uint160 Hash160(const std::vector<unsigned char>& vch)
|
||||||
|
{
|
||||||
|
uint256 hash1;
|
||||||
|
SHA256(&vch[0], vch.size(), (unsigned char*)&hash1);
|
||||||
|
uint160 hash2;
|
||||||
|
RIPEMD160((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
|
||||||
|
return hash2;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -11,7 +11,7 @@
|
||||||
#include "allocators.h"
|
#include "allocators.h"
|
||||||
#include "serialize.h"
|
#include "serialize.h"
|
||||||
#include "uint256.h"
|
#include "uint256.h"
|
||||||
#include "util.h"
|
#include "hash.h"
|
||||||
|
|
||||||
#include <openssl/ec.h> // for EC_KEY definition
|
#include <openssl/ec.h> // for EC_KEY definition
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "netbase.h"
|
#include "netbase.h"
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include "addrman.h"
|
#include "addrman.h"
|
||||||
|
#include "hash.h"
|
||||||
|
|
||||||
class CNode;
|
class CNode;
|
||||||
class CBlockIndex;
|
class CBlockIndex;
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include "netbase.h"
|
#include "netbase.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "sync.h"
|
#include "sync.h"
|
||||||
|
#include "hash.h"
|
||||||
|
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
#include <sys/fcntl.h>
|
#include <sys/fcntl.h>
|
||||||
|
|
106
src/util.h
106
src/util.h
|
@ -24,9 +24,6 @@ typedef int pid_t; /* define for Windows compatibility */
|
||||||
#include <boost/date_time/gregorian/gregorian_types.hpp>
|
#include <boost/date_time/gregorian/gregorian_types.hpp>
|
||||||
#include <boost/date_time/posix_time/posix_time_types.hpp>
|
#include <boost/date_time/posix_time/posix_time_types.hpp>
|
||||||
|
|
||||||
#include <openssl/sha.h>
|
|
||||||
#include <openssl/ripemd.h>
|
|
||||||
|
|
||||||
#include "netbase.h" // for AddTimeData
|
#include "netbase.h" // for AddTimeData
|
||||||
|
|
||||||
typedef long long int64;
|
typedef long long int64;
|
||||||
|
@ -414,109 +411,6 @@ bool SoftSetBoolArg(const std::string& strArg, bool fValue);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
template<typename T1>
|
|
||||||
inline uint256 Hash(const T1 pbegin, const T1 pend)
|
|
||||||
{
|
|
||||||
static unsigned char pblank[1];
|
|
||||||
uint256 hash1;
|
|
||||||
SHA256((pbegin == pend ? pblank : (unsigned char*)&pbegin[0]), (pend - pbegin) * sizeof(pbegin[0]), (unsigned char*)&hash1);
|
|
||||||
uint256 hash2;
|
|
||||||
SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
|
|
||||||
return hash2;
|
|
||||||
}
|
|
||||||
|
|
||||||
class CHashWriter
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
SHA256_CTX ctx;
|
|
||||||
|
|
||||||
public:
|
|
||||||
int nType;
|
|
||||||
int nVersion;
|
|
||||||
|
|
||||||
void Init() {
|
|
||||||
SHA256_Init(&ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
CHashWriter(int nTypeIn, int nVersionIn) : nType(nTypeIn), nVersion(nVersionIn) {
|
|
||||||
Init();
|
|
||||||
}
|
|
||||||
|
|
||||||
CHashWriter& write(const char *pch, size_t size) {
|
|
||||||
SHA256_Update(&ctx, pch, size);
|
|
||||||
return (*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
// invalidates the object
|
|
||||||
uint256 GetHash() {
|
|
||||||
uint256 hash1;
|
|
||||||
SHA256_Final((unsigned char*)&hash1, &ctx);
|
|
||||||
uint256 hash2;
|
|
||||||
SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
|
|
||||||
return hash2;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
CHashWriter& operator<<(const T& obj) {
|
|
||||||
// Serialize to this stream
|
|
||||||
::Serialize(*this, obj, nType, nVersion);
|
|
||||||
return (*this);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template<typename T1, typename T2>
|
|
||||||
inline uint256 Hash(const T1 p1begin, const T1 p1end,
|
|
||||||
const T2 p2begin, const T2 p2end)
|
|
||||||
{
|
|
||||||
static unsigned char pblank[1];
|
|
||||||
uint256 hash1;
|
|
||||||
SHA256_CTX ctx;
|
|
||||||
SHA256_Init(&ctx);
|
|
||||||
SHA256_Update(&ctx, (p1begin == p1end ? pblank : (unsigned char*)&p1begin[0]), (p1end - p1begin) * sizeof(p1begin[0]));
|
|
||||||
SHA256_Update(&ctx, (p2begin == p2end ? pblank : (unsigned char*)&p2begin[0]), (p2end - p2begin) * sizeof(p2begin[0]));
|
|
||||||
SHA256_Final((unsigned char*)&hash1, &ctx);
|
|
||||||
uint256 hash2;
|
|
||||||
SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
|
|
||||||
return hash2;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T1, typename T2, typename T3>
|
|
||||||
inline uint256 Hash(const T1 p1begin, const T1 p1end,
|
|
||||||
const T2 p2begin, const T2 p2end,
|
|
||||||
const T3 p3begin, const T3 p3end)
|
|
||||||
{
|
|
||||||
static unsigned char pblank[1];
|
|
||||||
uint256 hash1;
|
|
||||||
SHA256_CTX ctx;
|
|
||||||
SHA256_Init(&ctx);
|
|
||||||
SHA256_Update(&ctx, (p1begin == p1end ? pblank : (unsigned char*)&p1begin[0]), (p1end - p1begin) * sizeof(p1begin[0]));
|
|
||||||
SHA256_Update(&ctx, (p2begin == p2end ? pblank : (unsigned char*)&p2begin[0]), (p2end - p2begin) * sizeof(p2begin[0]));
|
|
||||||
SHA256_Update(&ctx, (p3begin == p3end ? pblank : (unsigned char*)&p3begin[0]), (p3end - p3begin) * sizeof(p3begin[0]));
|
|
||||||
SHA256_Final((unsigned char*)&hash1, &ctx);
|
|
||||||
uint256 hash2;
|
|
||||||
SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
|
|
||||||
return hash2;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
uint256 SerializeHash(const T& obj, int nType=SER_GETHASH, int nVersion=PROTOCOL_VERSION)
|
|
||||||
{
|
|
||||||
CHashWriter ss(nType, nVersion);
|
|
||||||
ss << obj;
|
|
||||||
return ss.GetHash();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline uint160 Hash160(const std::vector<unsigned char>& vch)
|
|
||||||
{
|
|
||||||
uint256 hash1;
|
|
||||||
SHA256(&vch[0], vch.size(), (unsigned char*)&hash1);
|
|
||||||
uint160 hash2;
|
|
||||||
RIPEMD160((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
|
|
||||||
return hash2;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Median filter over a stream of values.
|
/** Median filter over a stream of values.
|
||||||
* Returns the median of the last N numbers
|
* Returns the median of the last N numbers
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue