1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2015 The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
8 #include "utilstrencodings.h"
13 template <unsigned int BITS
>
14 base_blob
<BITS
>::base_blob(const std::vector
<unsigned char>& vch
)
16 assert(vch
.size() == sizeof(data
));
17 memcpy(data
, &vch
[0], sizeof(data
));
20 template <unsigned int BITS
>
21 std::string base_blob
<BITS
>::GetHex() const
23 char psz
[sizeof(data
) * 2 + 1];
24 for (unsigned int i
= 0; i
< sizeof(data
); i
++)
25 sprintf(psz
+ i
* 2, "%02x", data
[sizeof(data
) - i
- 1]);
26 return std::string(psz
, psz
+ sizeof(data
) * 2);
29 template <unsigned int BITS
>
30 void base_blob
<BITS
>::SetHex(const char* psz
)
32 memset(data
, 0, sizeof(data
));
34 // skip leading spaces
39 if (psz
[0] == '0' && tolower(psz
[1]) == 'x')
43 const char* pbegin
= psz
;
44 while (::HexDigit(*psz
) != -1)
47 unsigned char* p1
= (unsigned char*)data
;
48 unsigned char* pend
= p1
+ WIDTH
;
49 while (psz
>= pbegin
&& p1
< pend
) {
50 *p1
= ::HexDigit(*psz
--);
52 *p1
|= ((unsigned char)::HexDigit(*psz
--) << 4);
58 template <unsigned int BITS
>
59 void base_blob
<BITS
>::SetHex(const std::string
& str
)
64 template <unsigned int BITS
>
65 std::string base_blob
<BITS
>::ToString() const
70 // Explicit instantiations for base_blob<160>
71 template base_blob
<160>::base_blob(const std::vector
<unsigned char>&);
72 template std::string base_blob
<160>::GetHex() const;
73 template std::string base_blob
<160>::ToString() const;
74 template void base_blob
<160>::SetHex(const char*);
75 template void base_blob
<160>::SetHex(const std::string
&);
77 // Explicit instantiations for base_blob<256>
78 template base_blob
<256>::base_blob(const std::vector
<unsigned char>&);
79 template std::string base_blob
<256>::GetHex() const;
80 template std::string base_blob
<256>::ToString() const;
81 template void base_blob
<256>::SetHex(const char*);
82 template void base_blob
<256>::SetHex(const std::string
&);
84 static void inline HashMix(uint32_t& a
, uint32_t& b
, uint32_t& c
)
86 // Taken from lookup3, by Bob Jenkins.
88 a
^= ((c
<< 4) | (c
>> 28));
91 b
^= ((a
<< 6) | (a
>> 26));
94 c
^= ((b
<< 8) | (b
>> 24));
97 a
^= ((c
<< 16) | (c
>> 16));
100 b
^= ((a
<< 19) | (a
>> 13));
103 c
^= ((b
<< 4) | (b
>> 28));
107 static void inline HashFinal(uint32_t& a
, uint32_t& b
, uint32_t& c
)
109 // Taken from lookup3, by Bob Jenkins.
111 c
-= ((b
<< 14) | (b
>> 18));
113 a
-= ((c
<< 11) | (c
>> 21));
115 b
-= ((a
<< 25) | (a
>> 7));
117 c
-= ((b
<< 16) | (b
>> 16));
119 a
-= ((c
<< 4) | (c
>> 28));
121 b
-= ((a
<< 14) | (a
>> 18));
123 c
-= ((b
<< 24) | (b
>> 8));
126 uint64_t uint256::GetHash(const uint256
& salt
) const
129 const uint32_t *pn
= (const uint32_t*)data
;
130 const uint32_t *salt_pn
= (const uint32_t*)salt
.data
;
131 a
= b
= c
= 0xdeadbeef + WIDTH
;
133 a
+= pn
[0] ^ salt_pn
[0];
134 b
+= pn
[1] ^ salt_pn
[1];
135 c
+= pn
[2] ^ salt_pn
[2];
137 a
+= pn
[3] ^ salt_pn
[3];
138 b
+= pn
[4] ^ salt_pn
[4];
139 c
+= pn
[5] ^ salt_pn
[5];
141 a
+= pn
[6] ^ salt_pn
[6];
142 b
+= pn
[7] ^ salt_pn
[7];
145 return ((((uint64_t)b
) << 32) | c
);