Electroneum
Loading...
Searching...
No Matches
hash.h
Go to the documentation of this file.
1
// Copyrights(c) 2017-2021, The Electroneum Project
2
// Copyrights(c) 2014-2019, The Monero Project
3
//
4
// All rights reserved.
5
//
6
// Redistribution and use in source and binary forms, with or without modification, are
7
// permitted provided that the following conditions are met:
8
//
9
// 1. Redistributions of source code must retain the above copyright notice, this list of
10
// conditions and the following disclaimer.
11
//
12
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
13
// of conditions and the following disclaimer in the documentation and/or other
14
// materials provided with the distribution.
15
//
16
// 3. Neither the name of the copyright holder nor the names of its contributors may be
17
// used to endorse or promote products derived from this software without specific
18
// prior written permission.
19
//
20
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
21
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
22
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
23
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
27
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
28
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
//
30
// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
31
32
#pragma once
33
34
#include <stddef.h>
35
#include <iostream>
36
#include <boost/utility/value_init.hpp>
37
38
#include "
common/pod-class.h
"
39
#include "
generic-ops.h
"
40
#include "
hex.h
"
41
#include "
span.h
"
42
43
namespace
crypto
{
44
45
extern
"C"
{
46
#include "
hash-ops.h
"
47
}
48
49
#pragma pack(push, 1)
50
POD_CLASS
hash
{
51
char
data[
HASH_SIZE
];
52
};
53
POD_CLASS
hash8
{
54
char
data[8];
55
};
56
POD_CLASS
hash64
{
57
char
data[64];
58
};
59
#pragma pack(pop)
60
61
static_assert
(
sizeof
(
hash
) ==
HASH_SIZE
,
"Invalid structure size"
);
62
static_assert
(
sizeof
(
hash8
) == 8,
"Invalid structure size"
);
63
static_assert
(
sizeof
(
hash64
) == 64,
"Invalid structure size"
);
64
65
/*
66
Cryptonight hash functions
67
*/
68
69
inline
void
cn_fast_hash
(
const
void
*data, std::size_t length,
hash
&
hash
) {
70
cn_fast_hash
(data, length,
reinterpret_cast<
char
*
>
(&
hash
));
71
}
72
73
inline
hash
cn_fast_hash
(
const
void
*data, std::size_t length) {
74
hash
h;
75
cn_fast_hash
(data, length,
reinterpret_cast<
char
*
>
(&h));
76
return
h;
77
}
78
79
inline
void
cn_slow_hash
(
const
void
*data, std::size_t length,
hash
&
hash
,
int
variant = 0,
uint64_t
height
= 0) {
80
cn_slow_hash
(data, length,
reinterpret_cast<
char
*
>
(&
hash
), variant, 0
/*prehashed*/
,
height
);
81
}
82
83
inline
void
cn_slow_hash_prehashed
(
const
void
*data, std::size_t length,
hash
&
hash
,
int
variant = 0,
uint64_t
height
= 0) {
84
cn_slow_hash
(data, length,
reinterpret_cast<
char
*
>
(&
hash
), variant, 1
/*prehashed*/
,
height
);
85
}
86
87
inline
void
tree_hash
(
const
hash
*
hashes
, std::size_t count,
hash
&root_hash) {
88
tree_hash
(
reinterpret_cast<
const
char
(*)[
HASH_SIZE
]
>
(
hashes
), count,
reinterpret_cast<
char
*
>
(&root_hash));
89
}
90
91
inline
std::ostream &
operator <<
(std::ostream &o,
const
crypto::hash
&v) {
92
epee::to_hex::formatted
(o,
epee::as_byte_span
(v));
return
o;
93
}
94
inline
std::ostream &
operator <<
(std::ostream &o,
const
crypto::hash8
&v) {
95
epee::to_hex::formatted
(o,
epee::as_byte_span
(v));
return
o;
96
}
97
inline
std::ostream &
operator <<
(std::ostream &o,
const
crypto::hash64
&v) {
98
epee::to_hex::formatted
(o,
epee::as_byte_span
(v));
return
o;
99
}
100
101
const
static
crypto::hash
null_hash = boost::value_initialized<crypto::hash>();
102
const
static
crypto::hash8
null_hash8 = boost::value_initialized<crypto::hash8>();
103
const
static
crypto::hash64
null_hash64 = boost::value_initialized<crypto::hash64>();
104
}
105
106
CRYPTO_MAKE_HASHABLE
(
hash
)
107
CRYPTO_MAKE_COMPARABLE
(
hash8
)
108
CRYPTO_MAKE_COMPARABLE
(
hash64
)
height
uint64_t height
Definition
blockchain.cpp:91
generic-ops.h
CRYPTO_MAKE_COMPARABLE
#define CRYPTO_MAKE_COMPARABLE(type)
Definition
generic-ops.h:39
CRYPTO_MAKE_HASHABLE
#define CRYPTO_MAKE_HASHABLE(type)
Definition
generic-ops.h:76
hash-ops.h
hex.h
crypto
crypto namespace.
Definition
crypto.cpp:58
crypto::cn_slow_hash_prehashed
void cn_slow_hash_prehashed(const void *data, std::size_t length, hash &hash, int variant=0, uint64_t height=0)
Definition
hash.h:83
crypto::cn_fast_hash
void cn_fast_hash(const void *data, size_t length, char *hash)
crypto::hash8
POD_CLASS hash8
Definition
hash.h:53
crypto::cn_slow_hash
void cn_slow_hash(const void *data, size_t length, char *hash, int variant, int prehashed, uint64_t height)
crypto::uint64_t
unsigned __int64 uint64_t
Definition
hash.h:137
crypto::tree_hash
void tree_hash(const char(*hashes)[HASH_SIZE], size_t count, char *root_hash)
crypto::operator<<
std::ostream & operator<<(std::ostream &o, const crypto::public_key &v)
Definition
crypto.h:357
crypto::hash64
POD_CLASS hash64
Definition
hash.h:56
crypto::hash
POD_CLASS hash
Definition
hash.h:50
crypto::HASH_SIZE
@ HASH_SIZE
Definition
hash.h:78
epee::as_byte_span
span< const std::uint8_t > as_byte_span(const T &src) noexcept
Definition
span.h:153
pod-class.h
POD_CLASS
#define POD_CLASS
Definition
pod-class.h:44
span.h
epee::to_hex::formatted
static void formatted(std::ostream &out, const span< const std::uint8_t > src)
Append < + src + > as hex to out.
Definition
hex.cpp:76
hashes
struct hash_func hashes[]
src
crypto
hash.h
Generated on
for Electroneum by
1.16.1