Merge #9533: Allow non-power-of-2 signature cache sizes
7482781 Allow non-power-of-2 signature cache sizes (Pieter Wuille) Tree-SHA512: 5731c22b46c5ae81cf6d52000c28e39b243a47d96d91079942a5b5a10db214449217f71aa2195e18f8a3917cb206b04c75dc13e4522eb700a1dbf1819013ba22
This commit is contained in:
parent
1988088949
commit
f471b75aec
@ -154,7 +154,7 @@ public:
|
|||||||
* @tparam Element should be a movable and copyable type
|
* @tparam Element should be a movable and copyable type
|
||||||
* @tparam Hash should be a function/callable which takes a template parameter
|
* @tparam Hash should be a function/callable which takes a template parameter
|
||||||
* hash_select and an Element and extracts a hash from it. Should return
|
* hash_select and an Element and extracts a hash from it. Should return
|
||||||
* high-entropy hashes for `Hash h; h<0>(e) ... h<7>(e)`.
|
* high-entropy uint32_t hashes for `Hash h; h<0>(e) ... h<7>(e)`.
|
||||||
*/
|
*/
|
||||||
template <typename Element, typename Hash>
|
template <typename Element, typename Hash>
|
||||||
class cache
|
class cache
|
||||||
@ -193,12 +193,6 @@ private:
|
|||||||
*/
|
*/
|
||||||
uint32_t epoch_size;
|
uint32_t epoch_size;
|
||||||
|
|
||||||
/** hash_mask should be set to appropriately mask out a hash such that every
|
|
||||||
* masked hash is [0,size), eg, if floor(log2(size)) == 20, then hash_mask
|
|
||||||
* should be (1<<20)-1
|
|
||||||
*/
|
|
||||||
uint32_t hash_mask;
|
|
||||||
|
|
||||||
/** depth_limit determines how many elements insert should try to replace.
|
/** depth_limit determines how many elements insert should try to replace.
|
||||||
* Should be set to log2(n)*/
|
* Should be set to log2(n)*/
|
||||||
uint8_t depth_limit;
|
uint8_t depth_limit;
|
||||||
@ -217,14 +211,14 @@ private:
|
|||||||
*/
|
*/
|
||||||
inline std::array<uint32_t, 8> compute_hashes(const Element& e) const
|
inline std::array<uint32_t, 8> compute_hashes(const Element& e) const
|
||||||
{
|
{
|
||||||
return {{hash_function.template operator()<0>(e) & hash_mask,
|
return {{(uint32_t)((hash_function.template operator()<0>(e) * (uint64_t)size) >> 32),
|
||||||
hash_function.template operator()<1>(e) & hash_mask,
|
(uint32_t)((hash_function.template operator()<1>(e) * (uint64_t)size) >> 32),
|
||||||
hash_function.template operator()<2>(e) & hash_mask,
|
(uint32_t)((hash_function.template operator()<2>(e) * (uint64_t)size) >> 32),
|
||||||
hash_function.template operator()<3>(e) & hash_mask,
|
(uint32_t)((hash_function.template operator()<3>(e) * (uint64_t)size) >> 32),
|
||||||
hash_function.template operator()<4>(e) & hash_mask,
|
(uint32_t)((hash_function.template operator()<4>(e) * (uint64_t)size) >> 32),
|
||||||
hash_function.template operator()<5>(e) & hash_mask,
|
(uint32_t)((hash_function.template operator()<5>(e) * (uint64_t)size) >> 32),
|
||||||
hash_function.template operator()<6>(e) & hash_mask,
|
(uint32_t)((hash_function.template operator()<6>(e) * (uint64_t)size) >> 32),
|
||||||
hash_function.template operator()<7>(e) & hash_mask}};
|
(uint32_t)((hash_function.template operator()<7>(e) * (uint64_t)size) >> 32)}};
|
||||||
}
|
}
|
||||||
|
|
||||||
/* end
|
/* end
|
||||||
@ -305,7 +299,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** setup initializes the container to store no more than new_size
|
/** setup initializes the container to store no more than new_size
|
||||||
* elements. setup rounds down to a power of two size.
|
* elements.
|
||||||
*
|
*
|
||||||
* setup should only be called once.
|
* setup should only be called once.
|
||||||
*
|
*
|
||||||
@ -316,8 +310,7 @@ public:
|
|||||||
{
|
{
|
||||||
// depth_limit must be at least one otherwise errors can occur.
|
// depth_limit must be at least one otherwise errors can occur.
|
||||||
depth_limit = static_cast<uint8_t>(std::log2(static_cast<float>(std::max((uint32_t)2, new_size))));
|
depth_limit = static_cast<uint8_t>(std::log2(static_cast<float>(std::max((uint32_t)2, new_size))));
|
||||||
size = 1 << depth_limit;
|
size = std::max<uint32_t>(2, new_size);
|
||||||
hash_mask = size-1;
|
|
||||||
table.resize(size);
|
table.resize(size);
|
||||||
collection_flags.setup(size);
|
collection_flags.setup(size);
|
||||||
epoch_flags.resize(size);
|
epoch_flags.resize(size);
|
||||||
|
Loading…
Reference in New Issue
Block a user