mirror of
https://github.com/Xahau/xahaud.git
synced 2025-11-20 18:45:55 +00:00
Tidy up container hash functions:
* Add xxhasher * Move fnv1a, siphash, spookyto hash/ * Move hash_append, uhash to hash/ * Move hash_speed_test to hash/ * Move hash classes to individual header files * Remove hardened_hash
This commit is contained in:
@@ -247,32 +247,12 @@
|
|||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\beast\beast\container\detail\aged_unordered_container.h">
|
<ClInclude Include="..\..\src\beast\beast\container\detail\aged_unordered_container.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\beast\beast\container\hardened_hash.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\beast\beast\container\hash_append.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\beast\beast\container\impl\siphash.cpp">
|
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\beast\beast\container\impl\spookyv2.cpp">
|
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\beast\beast\container\impl\spookyv2.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\beast\beast\container\tests\aged_associative_container.test.cpp">
|
<ClCompile Include="..\..\src\beast\beast\container\tests\aged_associative_container.test.cpp">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\beast\beast\container\tests\buffer_view.test.cpp">
|
<ClCompile Include="..\..\src\beast\beast\container\tests\buffer_view.test.cpp">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\beast\beast\container\tests\hardened_hash.test.cpp">
|
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\beast\beast\container\tests\hash_append.test.cpp">
|
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\beast\beast\container\tests\hash_metrics.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\beast\beast\crypto\base64.h">
|
<ClInclude Include="..\..\src\beast\beast\crypto\base64.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClCompile Include="..\..\src\beast\beast\crypto\Crypto.unity.cpp">
|
<ClCompile Include="..\..\src\beast\beast\crypto\Crypto.unity.cpp">
|
||||||
@@ -311,6 +291,37 @@
|
|||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\beast\beast\cxx14\utility.h">
|
<ClInclude Include="..\..\src\beast\beast\cxx14\utility.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\beast\beast\hash\fnv1a.h">
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\beast\beast\hash\hash_append.h">
|
||||||
|
</ClInclude>
|
||||||
|
<ClCompile Include="..\..\src\beast\beast\hash\impl\siphash.cpp">
|
||||||
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\beast\beast\hash\impl\spookyv2.cpp">
|
||||||
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClInclude Include="..\..\src\beast\beast\hash\impl\spookyv2.h">
|
||||||
|
</ClInclude>
|
||||||
|
<ClCompile Include="..\..\src\beast\beast\hash\impl\xxhash.c">
|
||||||
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClInclude Include="..\..\src\beast\beast\hash\impl\xxhash.h">
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\beast\beast\hash\siphash.h">
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\beast\beast\hash\spooky.h">
|
||||||
|
</ClInclude>
|
||||||
|
<ClCompile Include="..\..\src\beast\beast\hash\tests\hash_append_test.cpp">
|
||||||
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClInclude Include="..\..\src\beast\beast\hash\tests\hash_metrics.h">
|
||||||
|
</ClInclude>
|
||||||
|
<ClCompile Include="..\..\src\beast\beast\hash\tests\hash_speed_test.cpp">
|
||||||
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClInclude Include="..\..\src\beast\beast\hash\xxhasher.h">
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\beast\beast\HeapBlock.h">
|
<ClInclude Include="..\..\src\beast\beast\HeapBlock.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\beast\beast\http\basic_parser.h">
|
<ClInclude Include="..\..\src\beast\beast\http\basic_parser.h">
|
||||||
@@ -794,6 +805,8 @@
|
|||||||
<ClCompile Include="..\..\src\beast\beast\net\tests\IPEndpoint.test.cpp">
|
<ClCompile Include="..\..\src\beast\beast\net\tests\IPEndpoint.test.cpp">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClInclude Include="..\..\src\beast\beast\random\rngfill.h">
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\beast\beast\random\xor_shift_engine.h">
|
<ClInclude Include="..\..\src\beast\beast\random\xor_shift_engine.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\beast\beast\SmartPtr.h">
|
<ClInclude Include="..\..\src\beast\beast\SmartPtr.h">
|
||||||
@@ -891,6 +904,8 @@
|
|||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\beast\beast\threads\WaitableEvent.h">
|
<ClInclude Include="..\..\src\beast\beast\threads\WaitableEvent.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClCompile Include="..\..\src\beast\beast\unity\hash_unity.cpp">
|
||||||
|
</ClCompile>
|
||||||
<ClInclude Include="..\..\src\beast\beast\unit_test.h">
|
<ClInclude Include="..\..\src\beast\beast\unit_test.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\beast\beast\unit_test\amount.h">
|
<ClInclude Include="..\..\src\beast\beast\unit_test\amount.h">
|
||||||
|
|||||||
@@ -37,9 +37,6 @@
|
|||||||
<Filter Include="beast\container\detail">
|
<Filter Include="beast\container\detail">
|
||||||
<UniqueIdentifier>{B3ABC912-8DA0-AA35-302C-A0C614EDFDCE}</UniqueIdentifier>
|
<UniqueIdentifier>{B3ABC912-8DA0-AA35-302C-A0C614EDFDCE}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="beast\container\impl">
|
|
||||||
<UniqueIdentifier>{3B2EC044-6A81-F182-B783-B6D14DED827C}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="beast\container\tests">
|
<Filter Include="beast\container\tests">
|
||||||
<UniqueIdentifier>{558F281D-B411-3676-A0DE-4B8C0D3B53A0}</UniqueIdentifier>
|
<UniqueIdentifier>{558F281D-B411-3676-A0DE-4B8C0D3B53A0}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
@@ -61,6 +58,15 @@
|
|||||||
<Filter Include="beast\cxx14\tests">
|
<Filter Include="beast\cxx14\tests">
|
||||||
<UniqueIdentifier>{96F8CA0B-80D3-8AEA-EE13-B39EE1CF91B0}</UniqueIdentifier>
|
<UniqueIdentifier>{96F8CA0B-80D3-8AEA-EE13-B39EE1CF91B0}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter Include="beast\hash">
|
||||||
|
<UniqueIdentifier>{FE3C8FFD-FEE1-BDEA-DE7F-24A8DEDCAD20}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="beast\hash\impl">
|
||||||
|
<UniqueIdentifier>{5D0A694C-9709-709C-EDCB-4332E2457AE4}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="beast\hash\tests">
|
||||||
|
<UniqueIdentifier>{2B06CD3F-1F3C-7832-DB4E-112BDCE74C94}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
<Filter Include="beast\http">
|
<Filter Include="beast\http">
|
||||||
<UniqueIdentifier>{7138D215-DA65-98D5-EF7D-C9896685201E}</UniqueIdentifier>
|
<UniqueIdentifier>{7138D215-DA65-98D5-EF7D-C9896685201E}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
@@ -187,6 +193,9 @@
|
|||||||
<Filter Include="beast\threads\impl">
|
<Filter Include="beast\threads\impl">
|
||||||
<UniqueIdentifier>{E8A9A46E-3151-7072-ADF1-C230D86E9791}</UniqueIdentifier>
|
<UniqueIdentifier>{E8A9A46E-3151-7072-ADF1-C230D86E9791}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter Include="beast\unity">
|
||||||
|
<UniqueIdentifier>{40FDA51E-20C4-4A72-83C3-A4B08C596A82}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
<Filter Include="beast\unit_test">
|
<Filter Include="beast\unit_test">
|
||||||
<UniqueIdentifier>{2762284D-66E5-8B48-1F8E-67116DB1FC6B}</UniqueIdentifier>
|
<UniqueIdentifier>{2762284D-66E5-8B48-1F8E-67116DB1FC6B}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
@@ -756,36 +765,12 @@
|
|||||||
<ClInclude Include="..\..\src\beast\beast\container\detail\aged_unordered_container.h">
|
<ClInclude Include="..\..\src\beast\beast\container\detail\aged_unordered_container.h">
|
||||||
<Filter>beast\container\detail</Filter>
|
<Filter>beast\container\detail</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\beast\beast\container\hardened_hash.h">
|
|
||||||
<Filter>beast\container</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\beast\beast\container\hash_append.h">
|
|
||||||
<Filter>beast\container</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\beast\beast\container\impl\siphash.cpp">
|
|
||||||
<Filter>beast\container\impl</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\beast\beast\container\impl\spookyv2.cpp">
|
|
||||||
<Filter>beast\container\impl</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\beast\beast\container\impl\spookyv2.h">
|
|
||||||
<Filter>beast\container\impl</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\beast\beast\container\tests\aged_associative_container.test.cpp">
|
<ClCompile Include="..\..\src\beast\beast\container\tests\aged_associative_container.test.cpp">
|
||||||
<Filter>beast\container\tests</Filter>
|
<Filter>beast\container\tests</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\beast\beast\container\tests\buffer_view.test.cpp">
|
<ClCompile Include="..\..\src\beast\beast\container\tests\buffer_view.test.cpp">
|
||||||
<Filter>beast\container\tests</Filter>
|
<Filter>beast\container\tests</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\beast\beast\container\tests\hardened_hash.test.cpp">
|
|
||||||
<Filter>beast\container\tests</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\beast\beast\container\tests\hash_append.test.cpp">
|
|
||||||
<Filter>beast\container\tests</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\beast\beast\container\tests\hash_metrics.h">
|
|
||||||
<Filter>beast\container\tests</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\beast\beast\crypto\base64.h">
|
<ClInclude Include="..\..\src\beast\beast\crypto\base64.h">
|
||||||
<Filter>beast\crypto</Filter>
|
<Filter>beast\crypto</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@@ -834,6 +819,45 @@
|
|||||||
<ClInclude Include="..\..\src\beast\beast\cxx14\utility.h">
|
<ClInclude Include="..\..\src\beast\beast\cxx14\utility.h">
|
||||||
<Filter>beast\cxx14</Filter>
|
<Filter>beast\cxx14</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\beast\beast\hash\fnv1a.h">
|
||||||
|
<Filter>beast\hash</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\beast\beast\hash\hash_append.h">
|
||||||
|
<Filter>beast\hash</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClCompile Include="..\..\src\beast\beast\hash\impl\siphash.cpp">
|
||||||
|
<Filter>beast\hash\impl</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\beast\beast\hash\impl\spookyv2.cpp">
|
||||||
|
<Filter>beast\hash\impl</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClInclude Include="..\..\src\beast\beast\hash\impl\spookyv2.h">
|
||||||
|
<Filter>beast\hash\impl</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClCompile Include="..\..\src\beast\beast\hash\impl\xxhash.c">
|
||||||
|
<Filter>beast\hash\impl</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClInclude Include="..\..\src\beast\beast\hash\impl\xxhash.h">
|
||||||
|
<Filter>beast\hash\impl</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\beast\beast\hash\siphash.h">
|
||||||
|
<Filter>beast\hash</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\beast\beast\hash\spooky.h">
|
||||||
|
<Filter>beast\hash</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClCompile Include="..\..\src\beast\beast\hash\tests\hash_append_test.cpp">
|
||||||
|
<Filter>beast\hash\tests</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClInclude Include="..\..\src\beast\beast\hash\tests\hash_metrics.h">
|
||||||
|
<Filter>beast\hash\tests</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClCompile Include="..\..\src\beast\beast\hash\tests\hash_speed_test.cpp">
|
||||||
|
<Filter>beast\hash\tests</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClInclude Include="..\..\src\beast\beast\hash\xxhasher.h">
|
||||||
|
<Filter>beast\hash</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\beast\beast\HeapBlock.h">
|
<ClInclude Include="..\..\src\beast\beast\HeapBlock.h">
|
||||||
<Filter>beast</Filter>
|
<Filter>beast</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@@ -1434,6 +1458,9 @@
|
|||||||
<ClCompile Include="..\..\src\beast\beast\net\tests\IPEndpoint.test.cpp">
|
<ClCompile Include="..\..\src\beast\beast\net\tests\IPEndpoint.test.cpp">
|
||||||
<Filter>beast\net\tests</Filter>
|
<Filter>beast\net\tests</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClInclude Include="..\..\src\beast\beast\random\rngfill.h">
|
||||||
|
<Filter>beast\random</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\beast\beast\random\xor_shift_engine.h">
|
<ClInclude Include="..\..\src\beast\beast\random\xor_shift_engine.h">
|
||||||
<Filter>beast\random</Filter>
|
<Filter>beast\random</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@@ -1563,6 +1590,9 @@
|
|||||||
<ClInclude Include="..\..\src\beast\beast\threads\WaitableEvent.h">
|
<ClInclude Include="..\..\src\beast\beast\threads\WaitableEvent.h">
|
||||||
<Filter>beast\threads</Filter>
|
<Filter>beast\threads</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClCompile Include="..\..\src\beast\beast\unity\hash_unity.cpp">
|
||||||
|
<Filter>beast\unity</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClInclude Include="..\..\src\beast\beast\unit_test.h">
|
<ClInclude Include="..\..\src\beast\beast\unit_test.h">
|
||||||
<Filter>beast</Filter>
|
<Filter>beast</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
|||||||
@@ -642,6 +642,7 @@ for tu_style in ['classic', 'unity']:
|
|||||||
**git_commit_tag)
|
**git_commit_tag)
|
||||||
|
|
||||||
object_builder.add_source_files(
|
object_builder.add_source_files(
|
||||||
|
'src/beast/beast/unity/hash_unity.cpp',
|
||||||
'src/ripple/unity/beast.cpp',
|
'src/ripple/unity/beast.cpp',
|
||||||
'src/ripple/unity/protobuf.cpp',
|
'src/ripple/unity/protobuf.cpp',
|
||||||
'src/ripple/unity/ripple.proto.cpp',
|
'src/ripple/unity/ripple.proto.cpp',
|
||||||
|
|||||||
@@ -21,10 +21,5 @@
|
|||||||
#include <BeastConfig.h>
|
#include <BeastConfig.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <beast/container/impl/spookyv2.cpp>
|
|
||||||
#include <beast/container/impl/siphash.cpp>
|
|
||||||
|
|
||||||
#include <beast/container/tests/aged_associative_container.test.cpp>
|
#include <beast/container/tests/aged_associative_container.test.cpp>
|
||||||
#include <beast/container/tests/buffer_view.test.cpp>
|
#include <beast/container/tests/buffer_view.test.cpp>
|
||||||
#include <beast/container/tests/hardened_hash.test.cpp>
|
|
||||||
#include <beast/container/tests/hash_append.test.cpp>
|
|
||||||
|
|||||||
@@ -1,167 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of Beast: https://github.com/vinniefalco/Beast
|
|
||||||
Copyright 2013, Vinnie Falco <vinnie.falco@gmail.com>
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
//==============================================================================
|
|
||||||
|
|
||||||
#ifndef BEAST_CONTAINER_HARDENED_HASH_H_INCLUDED
|
|
||||||
#define BEAST_CONTAINER_HARDENED_HASH_H_INCLUDED
|
|
||||||
|
|
||||||
#include <beast/container/hash_append.h>
|
|
||||||
#include <beast/cxx14/utility.h> // <utility>
|
|
||||||
#include <beast/cxx14/type_traits.h> // <type_traits>
|
|
||||||
#include <beast/utility/noexcept.h>
|
|
||||||
#include <beast/utility/static_initializer.h>
|
|
||||||
|
|
||||||
#include <cstdint>
|
|
||||||
#include <functional>
|
|
||||||
#include <mutex>
|
|
||||||
#include <random>
|
|
||||||
#include <unordered_map>
|
|
||||||
#include <unordered_set>
|
|
||||||
|
|
||||||
// When set to 1, makes the seed per-process instead
|
|
||||||
// of per default-constructed instance of hardened_hash
|
|
||||||
//
|
|
||||||
#ifndef BEAST_NO_HARDENED_HASH_INSTANCE_SEED
|
|
||||||
# ifdef __GLIBCXX__
|
|
||||||
# define BEAST_NO_HARDENED_HASH_INSTANCE_SEED 1
|
|
||||||
# else
|
|
||||||
# define BEAST_NO_HARDENED_HASH_INSTANCE_SEED 0
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace beast {
|
|
||||||
|
|
||||||
using seed_pair = std::pair<std::uint64_t, std::uint64_t>;
|
|
||||||
|
|
||||||
template <bool = true>
|
|
||||||
seed_pair
|
|
||||||
get_seed_pair() noexcept
|
|
||||||
{
|
|
||||||
struct state_t
|
|
||||||
{
|
|
||||||
std::mutex mutex;
|
|
||||||
std::random_device rng;
|
|
||||||
std::mt19937_64 gen {rng()};
|
|
||||||
std::uniform_int_distribution <std::uint64_t> dist;
|
|
||||||
|
|
||||||
state_t() : gen(rng()) {}
|
|
||||||
// state_t(state_t const&) = delete;
|
|
||||||
// state_t& operator=(state_t const&) = delete;
|
|
||||||
};
|
|
||||||
static static_initializer <state_t> state;
|
|
||||||
std::lock_guard <std::mutex> lock (state->mutex);
|
|
||||||
return {state->dist(state->gen), state->dist(state->gen)};
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class HashAlgorithm, bool ProcessSeeded>
|
|
||||||
class basic_hardened_hash;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Seed functor once per process
|
|
||||||
*/
|
|
||||||
template <class HashAlgorithm>
|
|
||||||
class basic_hardened_hash<HashAlgorithm, true>
|
|
||||||
{
|
|
||||||
static
|
|
||||||
seed_pair const&
|
|
||||||
init_seed_pair()
|
|
||||||
{
|
|
||||||
static static_initializer <seed_pair, basic_hardened_hash> const
|
|
||||||
p(get_seed_pair<>());
|
|
||||||
return *p;
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
using result_type = typename HashAlgorithm::result_type;
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
result_type
|
|
||||||
operator()(T const& t) const noexcept
|
|
||||||
{
|
|
||||||
std::uint64_t seed0;
|
|
||||||
std::uint64_t seed1;
|
|
||||||
std::tie(seed0, seed1) = init_seed_pair();
|
|
||||||
HashAlgorithm h(seed0, seed1);
|
|
||||||
hash_append(h, t);
|
|
||||||
return static_cast<result_type>(h);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Seed functor once per construction
|
|
||||||
*/
|
|
||||||
template <class HashAlgorithm>
|
|
||||||
class basic_hardened_hash<HashAlgorithm, false>
|
|
||||||
{
|
|
||||||
seed_pair m_seeds;
|
|
||||||
public:
|
|
||||||
using result_type = typename HashAlgorithm::result_type;
|
|
||||||
|
|
||||||
basic_hardened_hash()
|
|
||||||
: m_seeds(get_seed_pair<>())
|
|
||||||
{}
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
result_type
|
|
||||||
operator()(T const& t) const noexcept
|
|
||||||
{
|
|
||||||
HashAlgorithm h(m_seeds.first, m_seeds.second);
|
|
||||||
hash_append(h, t);
|
|
||||||
return static_cast<result_type>(h);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/** A std compatible hash adapter that resists adversarial inputs.
|
|
||||||
For this to work, T must implement in its own namespace:
|
|
||||||
|
|
||||||
@code
|
|
||||||
|
|
||||||
template <class Hasher>
|
|
||||||
void
|
|
||||||
hash_append (Hasher& h, T const& t) noexcept
|
|
||||||
{
|
|
||||||
// hash_append each base and member that should
|
|
||||||
// participate in forming the hash
|
|
||||||
using beast::hash_append;
|
|
||||||
hash_append (h, static_cast<T::base1 const&>(t));
|
|
||||||
hash_append (h, static_cast<T::base2 const&>(t));
|
|
||||||
// ...
|
|
||||||
hash_append (h, t.member1);
|
|
||||||
hash_append (h, t.member2);
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
Do not use any version of Murmur or CityHash for the Hasher
|
|
||||||
template parameter (the hashing algorithm). For details
|
|
||||||
see https://131002.net/siphash/#at
|
|
||||||
*/
|
|
||||||
#if BEAST_NO_HARDENED_HASH_INSTANCE_SEED
|
|
||||||
template <class HashAlgorithm = siphash>
|
|
||||||
using hardened_hash = basic_hardened_hash<HashAlgorithm, true>;
|
|
||||||
#else
|
|
||||||
template <class HashAlgorithm = siphash>
|
|
||||||
using hardened_hash = basic_hardened_hash<HashAlgorithm, false>;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} // beast
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,313 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of Beast: https://github.com/vinniefalco/Beast
|
|
||||||
Copyright 2013, Vinnie Falco <vinnie.falco@gmail.com>
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
//==============================================================================
|
|
||||||
|
|
||||||
// MODULES: ../../crypto/impl/Sha256.cpp ../../container/impl/spookyv2.cpp
|
|
||||||
|
|
||||||
#if BEAST_INCLUDE_BEASTCONFIG
|
|
||||||
#include <BeastConfig.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <beast/container/hardened_hash.h>
|
|
||||||
#include <beast/unit_test/suite.h>
|
|
||||||
|
|
||||||
#include <beast/crypto/Sha256.h>
|
|
||||||
#include <boost/functional/hash.hpp>
|
|
||||||
|
|
||||||
#include <array>
|
|
||||||
#include <cstdint>
|
|
||||||
#include <iomanip>
|
|
||||||
#include <functional>
|
|
||||||
#include <unordered_map>
|
|
||||||
#include <unordered_set>
|
|
||||||
|
|
||||||
namespace beast {
|
|
||||||
namespace detail {
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
class test_user_type_member
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
T t;
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit test_user_type_member (T const& t_ = T())
|
|
||||||
: t (t_)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Hasher>
|
|
||||||
friend void hash_append (Hasher& h, test_user_type_member const& a) noexcept
|
|
||||||
{
|
|
||||||
using beast::hash_append;
|
|
||||||
hash_append (h, a.t);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
class test_user_type_free
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
T t;
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit test_user_type_free (T const& t_ = T())
|
|
||||||
: t (t_)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Hasher>
|
|
||||||
friend void hash_append (Hasher& h, test_user_type_free const& a) noexcept
|
|
||||||
{
|
|
||||||
using beast::hash_append;
|
|
||||||
hash_append (h, a.t);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // detail
|
|
||||||
} // beast
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
namespace beast {
|
|
||||||
|
|
||||||
namespace detail {
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
using test_hardened_unordered_set =
|
|
||||||
std::unordered_set <T, hardened_hash <>>;
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
using test_hardened_unordered_map =
|
|
||||||
std::unordered_map <T, int, hardened_hash <>>;
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
using test_hardened_unordered_multiset =
|
|
||||||
std::unordered_multiset <T, hardened_hash <>>;
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
using test_hardened_unordered_multimap =
|
|
||||||
std::unordered_multimap <T, int, hardened_hash <>>;
|
|
||||||
|
|
||||||
} // beast
|
|
||||||
|
|
||||||
template <std::size_t Bits, class UInt = std::uint64_t>
|
|
||||||
class unsigned_integer
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
static_assert (std::is_integral<UInt>::value &&
|
|
||||||
std::is_unsigned <UInt>::value,
|
|
||||||
"UInt must be an unsigned integral type");
|
|
||||||
|
|
||||||
static_assert (Bits%(8*sizeof(UInt))==0,
|
|
||||||
"Bits must be a multiple of 8*sizeof(UInt)");
|
|
||||||
|
|
||||||
static_assert (Bits >= (8*sizeof(UInt)),
|
|
||||||
"Bits must be at least 8*sizeof(UInt)");
|
|
||||||
|
|
||||||
static std::size_t const size = Bits/(8*sizeof(UInt));
|
|
||||||
|
|
||||||
std::array <UInt, size> m_vec;
|
|
||||||
|
|
||||||
public:
|
|
||||||
typedef UInt value_type;
|
|
||||||
|
|
||||||
static std::size_t const bits = Bits;
|
|
||||||
static std::size_t const bytes = bits / 8;
|
|
||||||
|
|
||||||
template <class Int>
|
|
||||||
static
|
|
||||||
unsigned_integer
|
|
||||||
from_number (Int v)
|
|
||||||
{
|
|
||||||
unsigned_integer result;
|
|
||||||
for (std::size_t i (1); i < size; ++i)
|
|
||||||
result.m_vec [i] = 0;
|
|
||||||
result.m_vec[0] = v;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void*
|
|
||||||
data() noexcept
|
|
||||||
{
|
|
||||||
return &m_vec[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
void const*
|
|
||||||
data() const noexcept
|
|
||||||
{
|
|
||||||
return &m_vec[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Hasher>
|
|
||||||
friend void hash_append(Hasher& h, unsigned_integer const& a) noexcept
|
|
||||||
{
|
|
||||||
using beast::hash_append;
|
|
||||||
hash_append (h, a.m_vec);
|
|
||||||
}
|
|
||||||
|
|
||||||
friend
|
|
||||||
std::ostream&
|
|
||||||
operator<< (std::ostream& s, unsigned_integer const& v)
|
|
||||||
{
|
|
||||||
for (std::size_t i (0); i < size; ++i)
|
|
||||||
s <<
|
|
||||||
std::hex <<
|
|
||||||
std::setfill ('0') <<
|
|
||||||
std::setw (2*sizeof(UInt)) <<
|
|
||||||
v.m_vec[i]
|
|
||||||
;
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef unsigned_integer <256, std::size_t> sha256_t;
|
|
||||||
|
|
||||||
static_assert (sha256_t::bits == 256,
|
|
||||||
"sha256_t must have 256 bits");
|
|
||||||
|
|
||||||
} // beast
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
namespace beast {
|
|
||||||
|
|
||||||
class hardened_hash_test
|
|
||||||
: public unit_test::suite
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
template <class T>
|
|
||||||
void
|
|
||||||
check ()
|
|
||||||
{
|
|
||||||
T t{};
|
|
||||||
hardened_hash <>() (t);
|
|
||||||
pass();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <template <class T> class U>
|
|
||||||
void
|
|
||||||
check_user_type()
|
|
||||||
{
|
|
||||||
check <U <bool>> ();
|
|
||||||
check <U <char>> ();
|
|
||||||
check <U <signed char>> ();
|
|
||||||
check <U <unsigned char>> ();
|
|
||||||
// These cause trouble for boost
|
|
||||||
//check <U <char16_t>> ();
|
|
||||||
//check <U <char32_t>> ();
|
|
||||||
check <U <wchar_t>> ();
|
|
||||||
check <U <short>> ();
|
|
||||||
check <U <unsigned short>> ();
|
|
||||||
check <U <int>> ();
|
|
||||||
check <U <unsigned int>> ();
|
|
||||||
check <U <long>> ();
|
|
||||||
check <U <long long>> ();
|
|
||||||
check <U <unsigned long>> ();
|
|
||||||
check <U <unsigned long long>> ();
|
|
||||||
check <U <float>> ();
|
|
||||||
check <U <double>> ();
|
|
||||||
check <U <long double>> ();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <template <class T> class C >
|
|
||||||
void
|
|
||||||
check_container()
|
|
||||||
{
|
|
||||||
{
|
|
||||||
C <detail::test_user_type_member <std::string>> c;
|
|
||||||
}
|
|
||||||
|
|
||||||
pass();
|
|
||||||
|
|
||||||
{
|
|
||||||
C <detail::test_user_type_free <std::string>> c;
|
|
||||||
}
|
|
||||||
|
|
||||||
pass();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
test_user_types()
|
|
||||||
{
|
|
||||||
testcase ("user types");
|
|
||||||
check_user_type <detail::test_user_type_member> ();
|
|
||||||
check_user_type <detail::test_user_type_free> ();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
test_containers()
|
|
||||||
{
|
|
||||||
testcase ("containers");
|
|
||||||
check_container <detail::test_hardened_unordered_set>();
|
|
||||||
check_container <detail::test_hardened_unordered_map>();
|
|
||||||
check_container <detail::test_hardened_unordered_multiset>();
|
|
||||||
check_container <detail::test_hardened_unordered_multimap>();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
run ()
|
|
||||||
{
|
|
||||||
test_user_types();
|
|
||||||
test_containers();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class hardened_hash_sha256_test
|
|
||||||
: public unit_test::suite
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void
|
|
||||||
testSHA256()
|
|
||||||
{
|
|
||||||
testcase ("sha256");
|
|
||||||
|
|
||||||
log <<
|
|
||||||
"sizeof(std::size_t) == " << sizeof(std::size_t);
|
|
||||||
|
|
||||||
hardened_hash <> h;
|
|
||||||
for (int i = 0; i < 100; ++i)
|
|
||||||
{
|
|
||||||
sha256_t v (sha256_t::from_number (i));
|
|
||||||
Sha256::digest_type d;
|
|
||||||
Sha256::hash (v.data(), sha256_t::bytes, d);
|
|
||||||
sha256_t d_;
|
|
||||||
memcpy (d_.data(), d.data(), sha256_t::bytes);
|
|
||||||
std::size_t result (h (d_));
|
|
||||||
log <<
|
|
||||||
"i=" << std::setw(2) << i << " " <<
|
|
||||||
"sha256=0x" << d_ << " " <<
|
|
||||||
"hash=0x" <<
|
|
||||||
std::setfill ('0') <<
|
|
||||||
std::setw (2*sizeof(std::size_t)) << result
|
|
||||||
;
|
|
||||||
pass();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
run ()
|
|
||||||
{
|
|
||||||
testSHA256();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
BEAST_DEFINE_TESTSUITE(hardened_hash,utility,beast);
|
|
||||||
BEAST_DEFINE_TESTSUITE_MANUAL(hardened_hash_sha256,utility,beast);
|
|
||||||
|
|
||||||
} // beast
|
|
||||||
71
src/beast/beast/hash/fnv1a.h
Normal file
71
src/beast/beast/hash/fnv1a.h
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of Beast: https://github.com/vinniefalco/Beast
|
||||||
|
Copyright 2014, Howard Hinnant <howard.hinnant@gmail.com>,
|
||||||
|
Vinnie Falco <vinnie.falco@gmail.com
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#ifndef BEAST_HASH_FNV1A_H_INCLUDED
|
||||||
|
#define BEAST_HASH_FNV1A_H_INCLUDED
|
||||||
|
|
||||||
|
#include <beast/utility/noexcept.h>
|
||||||
|
#include <cstddef>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <beast/cxx14/type_traits.h> // <type_traits>
|
||||||
|
|
||||||
|
namespace beast {
|
||||||
|
|
||||||
|
// See http://www.isthe.com/chongo/tech/comp/fnv/
|
||||||
|
//
|
||||||
|
class fnv1a
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
std::uint64_t state_ = 14695981039346656037ULL;
|
||||||
|
|
||||||
|
public:
|
||||||
|
using result_type = std::size_t;
|
||||||
|
|
||||||
|
fnv1a() = default;
|
||||||
|
|
||||||
|
template <class Seed,
|
||||||
|
std::enable_if_t<
|
||||||
|
std::is_unsigned<Seed>::value>* = nullptr>
|
||||||
|
explicit
|
||||||
|
fnv1a (Seed seed)
|
||||||
|
{
|
||||||
|
append (&seed, sizeof(seed));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
append (void const* key, std::size_t len) noexcept
|
||||||
|
{
|
||||||
|
unsigned char const* p =
|
||||||
|
static_cast<unsigned char const*>(key);
|
||||||
|
unsigned char const* const e = p + len;
|
||||||
|
for (; p < e; ++p)
|
||||||
|
state_ = (state_ ^ *p) * 1099511628211ULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit
|
||||||
|
operator std::size_t() noexcept
|
||||||
|
{
|
||||||
|
return static_cast<std::size_t>(state_);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // beast
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -18,18 +18,14 @@
|
|||||||
*/
|
*/
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
|
||||||
#ifndef BEAST_CONTAINER_HASH_APPEND_H_INCLUDED
|
#ifndef BEAST_HASH_HASH_APPEND_H_INCLUDED
|
||||||
#define BEAST_CONTAINER_HASH_APPEND_H_INCLUDED
|
#define BEAST_HASH_HASH_APPEND_H_INCLUDED
|
||||||
|
|
||||||
#include <beast/utility/meta.h>
|
#include <beast/utility/meta.h>
|
||||||
|
#include <beast/utility/noexcept.h>
|
||||||
#include <beast/container/impl/spookyv2.h>
|
|
||||||
|
|
||||||
#if BEAST_USE_BOOST_FEATURES
|
#if BEAST_USE_BOOST_FEATURES
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <beast/utility/noexcept.h>
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
@@ -656,96 +652,6 @@ hash_append (Hasher& h, T0 const& t0, T1 const& t1, T const& ...t) noexcept
|
|||||||
hash_append (h, t1, t...);
|
hash_append (h, t1, t...);
|
||||||
}
|
}
|
||||||
|
|
||||||
// See http://www.isthe.com/chongo/tech/comp/fnv/
|
|
||||||
class fnv1a
|
|
||||||
{
|
|
||||||
std::uint64_t state_ = 14695981039346656037ULL;
|
|
||||||
public:
|
|
||||||
|
|
||||||
using result_type = std::size_t;
|
|
||||||
|
|
||||||
void
|
|
||||||
append (void const* key, std::size_t len) noexcept
|
|
||||||
{
|
|
||||||
unsigned char const* p = static_cast<unsigned char const*>(key);
|
|
||||||
unsigned char const* const e = p + len;
|
|
||||||
for (; p < e; ++p)
|
|
||||||
state_ = (state_ ^ *p) * 1099511628211ULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit
|
|
||||||
operator std::size_t() noexcept
|
|
||||||
{
|
|
||||||
return static_cast<std::size_t>(state_);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// See http://burtleburtle.net/bob/hash/spooky.html
|
|
||||||
class spooky
|
|
||||||
{
|
|
||||||
SpookyHash state_;
|
|
||||||
public:
|
|
||||||
using result_type = std::size_t;
|
|
||||||
|
|
||||||
spooky (std::size_t seed1 = 1, std::size_t seed2 = 2) noexcept
|
|
||||||
{
|
|
||||||
state_.Init (seed1, seed2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
append (void const* key, std::size_t len) noexcept
|
|
||||||
{
|
|
||||||
state_.Update (key, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit
|
|
||||||
operator std::size_t() noexcept
|
|
||||||
{
|
|
||||||
std::uint64_t h1, h2;
|
|
||||||
state_.Final (&h1, &h2);
|
|
||||||
return static_cast <std::size_t> (h1);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// See https://131002.net/siphash/
|
|
||||||
class siphash
|
|
||||||
{
|
|
||||||
std::uint64_t v0_ = 0x736f6d6570736575ULL;
|
|
||||||
std::uint64_t v1_ = 0x646f72616e646f6dULL;
|
|
||||||
std::uint64_t v2_ = 0x6c7967656e657261ULL;
|
|
||||||
std::uint64_t v3_ = 0x7465646279746573ULL;
|
|
||||||
unsigned char buf_[8];
|
|
||||||
unsigned bufsize_ = 0;
|
|
||||||
unsigned total_length_ = 0;
|
|
||||||
public:
|
|
||||||
using result_type = std::size_t;
|
|
||||||
|
|
||||||
siphash() = default;
|
|
||||||
explicit siphash(std::uint64_t k0, std::uint64_t k1 = 0) noexcept;
|
|
||||||
|
|
||||||
void
|
|
||||||
append (void const* key, std::size_t len) noexcept;
|
|
||||||
|
|
||||||
explicit
|
|
||||||
operator std::size_t() noexcept;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class Hasher = spooky>
|
|
||||||
struct uhash
|
|
||||||
{
|
|
||||||
using result_type = typename Hasher::result_type;
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
result_type
|
|
||||||
operator()(T const& t) const noexcept
|
|
||||||
{
|
|
||||||
Hasher h;
|
|
||||||
hash_append (h, t);
|
|
||||||
return static_cast<result_type>(h);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
} // beast
|
} // beast
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
85
src/beast/beast/hash/impl/hash_speed_test.cpp
Normal file
85
src/beast/beast/hash/impl/hash_speed_test.cpp
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of Beast: https://github.com/vinniefalco/Beast
|
||||||
|
Copyright 2013, Vinnie Falco <vinnie.falco@gmail.com>
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#if BEAST_INCLUDE_BEASTCONFIG
|
||||||
|
#include <BeastConfig.h>
|
||||||
|
#endif
|
||||||
|
#include <beast/container/fnv1a.h>
|
||||||
|
#include <beast/container/siphash.h>
|
||||||
|
#include <beast/container/xxhasher.h>
|
||||||
|
#include <beast/random/rngfill.h>
|
||||||
|
#include <beast/random/xor_shift_engine.h>
|
||||||
|
#include <beast/unit_test/suite.h>
|
||||||
|
#include <array>
|
||||||
|
#include <chrono>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstring>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <random>
|
||||||
|
|
||||||
|
namespace beast {
|
||||||
|
|
||||||
|
class hash_speed_test : public beast::unit_test::suite
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using clock_type =
|
||||||
|
std::chrono::high_resolution_clock;
|
||||||
|
template <class Hasher, std::size_t KeySize>
|
||||||
|
void
|
||||||
|
test (std::string const& what, std::size_t n)
|
||||||
|
{
|
||||||
|
using namespace std;
|
||||||
|
using namespace std::chrono;
|
||||||
|
xor_shift_engine g(1);
|
||||||
|
array<std::uint8_t, KeySize> key;
|
||||||
|
auto const start = clock_type::now();
|
||||||
|
while(n--)
|
||||||
|
{
|
||||||
|
rngfill (key, g);
|
||||||
|
Hasher h;
|
||||||
|
h.append(key.data(), KeySize);
|
||||||
|
volatile size_t temp =
|
||||||
|
static_cast<std::size_t>(h);
|
||||||
|
(void)temp;
|
||||||
|
}
|
||||||
|
auto const elapsed = clock_type::now() - start;
|
||||||
|
log << setw(12) << what << " " <<
|
||||||
|
duration<double>(elapsed) << "s";
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
run()
|
||||||
|
{
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
N = 100000000
|
||||||
|
};
|
||||||
|
|
||||||
|
#if ! BEAST_NO_XXHASH
|
||||||
|
test<xxhasher,32> ("xxhash", N);
|
||||||
|
#endif
|
||||||
|
test<fnv1a,32> ("fnv1a", N);
|
||||||
|
test<siphash,32> ("siphash", N);
|
||||||
|
pass();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
BEAST_DEFINE_TESTSUITE_MANUAL(hash_speed,container,beast);
|
||||||
|
|
||||||
|
} // beast
|
||||||
@@ -24,18 +24,15 @@
|
|||||||
//
|
//
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
#include <beast/container/hash_append.h>
|
#include <beast/hash/siphash.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
// namespace acme is used to demonstrate example code. It is not proposed.
|
// namespace acme is used to demonstrate example code. It is not proposed.
|
||||||
|
|
||||||
namespace beast
|
namespace beast {
|
||||||
{
|
namespace detail {
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
|
|
||||||
typedef std::uint64_t u64;
|
typedef std::uint64_t u64;
|
||||||
typedef std::uint32_t u32;
|
typedef std::uint32_t u32;
|
||||||
@@ -82,7 +79,7 @@ sipround(u64& v0, u64& v1, u64& v2, u64& v3)
|
|||||||
v2 = rotl(v2, 32);
|
v2 = rotl(v2, 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // unnamed
|
} // detail
|
||||||
|
|
||||||
siphash::siphash(std::uint64_t k0, std::uint64_t k1) noexcept
|
siphash::siphash(std::uint64_t k0, std::uint64_t k1) noexcept
|
||||||
{
|
{
|
||||||
@@ -95,6 +92,7 @@ siphash::siphash(std::uint64_t k0, std::uint64_t k1) noexcept
|
|||||||
void
|
void
|
||||||
siphash::append (void const* key, std::size_t inlen) noexcept
|
siphash::append (void const* key, std::size_t inlen) noexcept
|
||||||
{
|
{
|
||||||
|
using namespace detail;
|
||||||
u8 const* in = static_cast<const u8*>(key);
|
u8 const* in = static_cast<const u8*>(key);
|
||||||
total_length_ += inlen;
|
total_length_ += inlen;
|
||||||
if (bufsize_ + inlen < 8)
|
if (bufsize_ + inlen < 8)
|
||||||
@@ -130,6 +128,7 @@ siphash::append (void const* key, std::size_t inlen) noexcept
|
|||||||
|
|
||||||
siphash::operator std::size_t() noexcept
|
siphash::operator std::size_t() noexcept
|
||||||
{
|
{
|
||||||
|
using namespace detail;
|
||||||
std::size_t b = static_cast<u64>(total_length_) << 56;
|
std::size_t b = static_cast<u64>(total_length_) << 56;
|
||||||
switch(bufsize_)
|
switch(bufsize_)
|
||||||
{
|
{
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
// August 5 2012: SpookyV2: d = should be d += in short hash, and remove extra mix from long hash
|
// August 5 2012: SpookyV2: d = should be d += in short hash, and remove extra mix from long hash
|
||||||
|
|
||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
#include <beast/container/impl/spookyv2.h>
|
#include <beast/hash/impl/spookyv2.h>
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#pragma warning (push)
|
#pragma warning (push)
|
||||||
934
src/beast/beast/hash/impl/xxhash.c
Normal file
934
src/beast/beast/hash/impl/xxhash.c
Normal file
@@ -0,0 +1,934 @@
|
|||||||
|
/*
|
||||||
|
xxHash - Fast Hash algorithm
|
||||||
|
Copyright (C) 2012-2014, Yann Collet.
|
||||||
|
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
You can contact the author at :
|
||||||
|
- xxHash source repository : http://code.google.com/p/xxhash/
|
||||||
|
- public discussion board : https://groups.google.com/forum/#!forum/lz4c
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <beast/hash/impl/xxhash.h>
|
||||||
|
|
||||||
|
//**************************************
|
||||||
|
// Tuning parameters
|
||||||
|
//**************************************
|
||||||
|
// Unaligned memory access is automatically enabled for "common" CPU, such as x86.
|
||||||
|
// For others CPU, the compiler will be more cautious, and insert extra code to ensure aligned access is respected.
|
||||||
|
// If you know your target CPU supports unaligned memory access, you want to force this option manually to improve performance.
|
||||||
|
// You can also enable this parameter if you know your input data will always be aligned (boundaries of 4, for U32).
|
||||||
|
#if defined(__ARM_FEATURE_UNALIGNED) || defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64)
|
||||||
|
# define XXH_USE_UNALIGNED_ACCESS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// XXH_ACCEPT_NULL_INPUT_POINTER :
|
||||||
|
// If the input pointer is a null pointer, xxHash default behavior is to trigger a memory access error, since it is a bad pointer.
|
||||||
|
// When this option is enabled, xxHash output for null input pointers will be the same as a null-length input.
|
||||||
|
// This option has a very small performance cost (only measurable on small inputs).
|
||||||
|
// By default, this option is disabled. To enable it, uncomment below define :
|
||||||
|
// #define XXH_ACCEPT_NULL_INPUT_POINTER 1
|
||||||
|
|
||||||
|
// XXH_FORCE_NATIVE_FORMAT :
|
||||||
|
// By default, xxHash library provides endian-independant Hash values, based on little-endian convention.
|
||||||
|
// Results are therefore identical for little-endian and big-endian CPU.
|
||||||
|
// This comes at a performance cost for big-endian CPU, since some swapping is required to emulate little-endian format.
|
||||||
|
// Should endian-independance be of no importance for your application, you may set the #define below to 1.
|
||||||
|
// It will improve speed for Big-endian CPU.
|
||||||
|
// This option has no impact on Little_Endian CPU.
|
||||||
|
#define XXH_FORCE_NATIVE_FORMAT 0
|
||||||
|
|
||||||
|
//**************************************
|
||||||
|
// Compiler Specific Options
|
||||||
|
//**************************************
|
||||||
|
// Disable some Visual warning messages
|
||||||
|
#ifdef _MSC_VER // Visual Studio
|
||||||
|
# pragma warning(disable : 4127) // disable: C4127: conditional expression is constant
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _MSC_VER // Visual Studio
|
||||||
|
# define FORCE_INLINE static __forceinline
|
||||||
|
#else
|
||||||
|
# ifdef __GNUC__
|
||||||
|
# define FORCE_INLINE static inline __attribute__((always_inline))
|
||||||
|
# else
|
||||||
|
# define FORCE_INLINE static inline
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//**************************************
|
||||||
|
// Includes & Memory related functions
|
||||||
|
//**************************************
|
||||||
|
//#include "xxhash.h"
|
||||||
|
// Modify the local functions below should you wish to use some other memory routines
|
||||||
|
// for malloc(), free()
|
||||||
|
#include <stdlib.h>
|
||||||
|
static void* XXH_malloc(size_t s) { return malloc(s); }
|
||||||
|
static void XXH_free (void* p) { free(p); }
|
||||||
|
// for memcpy()
|
||||||
|
#include <string.h>
|
||||||
|
static void* XXH_memcpy(void* dest, const void* src, size_t size)
|
||||||
|
{
|
||||||
|
return memcpy(dest,src,size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************
|
||||||
|
// Basic Types
|
||||||
|
//**************************************
|
||||||
|
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L // C99
|
||||||
|
# include <stdint.h>
|
||||||
|
typedef uint8_t BYTE;
|
||||||
|
typedef uint16_t U16;
|
||||||
|
typedef uint32_t U32;
|
||||||
|
typedef int32_t S32;
|
||||||
|
typedef uint64_t U64;
|
||||||
|
#else
|
||||||
|
typedef unsigned char BYTE;
|
||||||
|
typedef unsigned short U16;
|
||||||
|
typedef unsigned int U32;
|
||||||
|
typedef signed int S32;
|
||||||
|
typedef unsigned long long U64;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__GNUC__) && !defined(XXH_USE_UNALIGNED_ACCESS)
|
||||||
|
# define _PACKED __attribute__ ((packed))
|
||||||
|
#else
|
||||||
|
# define _PACKED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(XXH_USE_UNALIGNED_ACCESS) && !defined(__GNUC__)
|
||||||
|
# ifdef __IBMC__
|
||||||
|
# pragma pack(1)
|
||||||
|
# else
|
||||||
|
# pragma pack(push, 1)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace beast {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
typedef struct _U32_S
|
||||||
|
{
|
||||||
|
U32 v;
|
||||||
|
} _PACKED U32_S;
|
||||||
|
typedef struct _U64_S
|
||||||
|
{
|
||||||
|
U64 v;
|
||||||
|
} _PACKED U64_S;
|
||||||
|
|
||||||
|
#if !defined(XXH_USE_UNALIGNED_ACCESS) && !defined(__GNUC__)
|
||||||
|
# pragma pack(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define A32(x) (((U32_S *)(x))->v)
|
||||||
|
#define A64(x) (((U64_S *)(x))->v)
|
||||||
|
|
||||||
|
|
||||||
|
//***************************************
|
||||||
|
// Compiler-specific Functions and Macros
|
||||||
|
//***************************************
|
||||||
|
#define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
|
||||||
|
|
||||||
|
// Note : although _rotl exists for minGW (GCC under windows), performance seems poor
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
# define XXH_rotl32(x,r) _rotl(x,r)
|
||||||
|
# define XXH_rotl64(x,r) _rotl64(x,r)
|
||||||
|
#else
|
||||||
|
# define XXH_rotl32(x,r) ((x << r) | (x >> (32 - r)))
|
||||||
|
# define XXH_rotl64(x,r) ((x << r) | (x >> (64 - r)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) // Visual Studio
|
||||||
|
# define XXH_swap32 _byteswap_ulong
|
||||||
|
# define XXH_swap64 _byteswap_uint64
|
||||||
|
#elif GCC_VERSION >= 403
|
||||||
|
# define XXH_swap32 __builtin_bswap32
|
||||||
|
# define XXH_swap64 __builtin_bswap64
|
||||||
|
#else
|
||||||
|
static inline U32 XXH_swap32 (U32 x)
|
||||||
|
{
|
||||||
|
return ((x << 24) & 0xff000000 ) |
|
||||||
|
((x << 8) & 0x00ff0000 ) |
|
||||||
|
((x >> 8) & 0x0000ff00 ) |
|
||||||
|
((x >> 24) & 0x000000ff );
|
||||||
|
}
|
||||||
|
static inline U64 XXH_swap64 (U64 x)
|
||||||
|
{
|
||||||
|
return ((x << 56) & 0xff00000000000000ULL) |
|
||||||
|
((x << 40) & 0x00ff000000000000ULL) |
|
||||||
|
((x << 24) & 0x0000ff0000000000ULL) |
|
||||||
|
((x << 8) & 0x000000ff00000000ULL) |
|
||||||
|
((x >> 8) & 0x00000000ff000000ULL) |
|
||||||
|
((x >> 24) & 0x0000000000ff0000ULL) |
|
||||||
|
((x >> 40) & 0x000000000000ff00ULL) |
|
||||||
|
((x >> 56) & 0x00000000000000ffULL);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************
|
||||||
|
// Constants
|
||||||
|
//**************************************
|
||||||
|
#define PRIME32_1 2654435761U
|
||||||
|
#define PRIME32_2 2246822519U
|
||||||
|
#define PRIME32_3 3266489917U
|
||||||
|
#define PRIME32_4 668265263U
|
||||||
|
#define PRIME32_5 374761393U
|
||||||
|
|
||||||
|
#define PRIME64_1 11400714785074694791ULL
|
||||||
|
#define PRIME64_2 14029467366897019727ULL
|
||||||
|
#define PRIME64_3 1609587929392839161ULL
|
||||||
|
#define PRIME64_4 9650029242287828579ULL
|
||||||
|
#define PRIME64_5 2870177450012600261ULL
|
||||||
|
|
||||||
|
//**************************************
|
||||||
|
// Architecture Macros
|
||||||
|
//**************************************
|
||||||
|
typedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess;
|
||||||
|
#ifndef XXH_CPU_LITTLE_ENDIAN // It is possible to define XXH_CPU_LITTLE_ENDIAN externally, for example using a compiler switch
|
||||||
|
static const int one = 1;
|
||||||
|
# define XXH_CPU_LITTLE_ENDIAN (*(char*)(&one))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************
|
||||||
|
// Macros
|
||||||
|
//**************************************
|
||||||
|
#define XXH_STATIC_ASSERT(c) { enum { XXH_static_assert = 1/(!!(c)) }; } // use only *after* variable declarations
|
||||||
|
|
||||||
|
|
||||||
|
//****************************
|
||||||
|
// Memory reads
|
||||||
|
//****************************
|
||||||
|
typedef enum { XXH_aligned, XXH_unaligned } XXH_alignment;
|
||||||
|
|
||||||
|
FORCE_INLINE U32 XXH_readLE32_align(const void* ptr, XXH_endianess endian, XXH_alignment align)
|
||||||
|
{
|
||||||
|
if (align==XXH_unaligned)
|
||||||
|
return endian==XXH_littleEndian ? A32(ptr) : XXH_swap32(A32(ptr));
|
||||||
|
else
|
||||||
|
return endian==XXH_littleEndian ? *(U32*)ptr : XXH_swap32(*(U32*)ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
FORCE_INLINE U32 XXH_readLE32(const void* ptr, XXH_endianess endian)
|
||||||
|
{
|
||||||
|
return XXH_readLE32_align(ptr, endian, XXH_unaligned);
|
||||||
|
}
|
||||||
|
|
||||||
|
FORCE_INLINE U64 XXH_readLE64_align(const void* ptr, XXH_endianess endian, XXH_alignment align)
|
||||||
|
{
|
||||||
|
if (align==XXH_unaligned)
|
||||||
|
return endian==XXH_littleEndian ? A64(ptr) : XXH_swap64(A64(ptr));
|
||||||
|
else
|
||||||
|
return endian==XXH_littleEndian ? *(U64*)ptr : XXH_swap64(*(U64*)ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
FORCE_INLINE U64 XXH_readLE64(const void* ptr, XXH_endianess endian)
|
||||||
|
{
|
||||||
|
return XXH_readLE64_align(ptr, endian, XXH_unaligned);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//****************************
|
||||||
|
// Simple Hash Functions
|
||||||
|
//****************************
|
||||||
|
FORCE_INLINE U32 XXH32_endian_align(const void* input, size_t len, U32 seed, XXH_endianess endian, XXH_alignment align)
|
||||||
|
{
|
||||||
|
const BYTE* p = (const BYTE*)input;
|
||||||
|
const BYTE* bEnd = p + len;
|
||||||
|
U32 h32;
|
||||||
|
#define XXH_get32bits(p) XXH_readLE32_align(p, endian, align)
|
||||||
|
|
||||||
|
#ifdef XXH_ACCEPT_NULL_INPUT_POINTER
|
||||||
|
if (p==NULL)
|
||||||
|
{
|
||||||
|
len=0;
|
||||||
|
bEnd=p=(const BYTE*)(size_t)16;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (len>=16)
|
||||||
|
{
|
||||||
|
const BYTE* const limit = bEnd - 16;
|
||||||
|
U32 v1 = seed + PRIME32_1 + PRIME32_2;
|
||||||
|
U32 v2 = seed + PRIME32_2;
|
||||||
|
U32 v3 = seed + 0;
|
||||||
|
U32 v4 = seed - PRIME32_1;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
v1 += XXH_get32bits(p) * PRIME32_2;
|
||||||
|
v1 = XXH_rotl32(v1, 13);
|
||||||
|
v1 *= PRIME32_1;
|
||||||
|
p+=4;
|
||||||
|
v2 += XXH_get32bits(p) * PRIME32_2;
|
||||||
|
v2 = XXH_rotl32(v2, 13);
|
||||||
|
v2 *= PRIME32_1;
|
||||||
|
p+=4;
|
||||||
|
v3 += XXH_get32bits(p) * PRIME32_2;
|
||||||
|
v3 = XXH_rotl32(v3, 13);
|
||||||
|
v3 *= PRIME32_1;
|
||||||
|
p+=4;
|
||||||
|
v4 += XXH_get32bits(p) * PRIME32_2;
|
||||||
|
v4 = XXH_rotl32(v4, 13);
|
||||||
|
v4 *= PRIME32_1;
|
||||||
|
p+=4;
|
||||||
|
}
|
||||||
|
while (p<=limit);
|
||||||
|
|
||||||
|
h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7) + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
h32 = seed + PRIME32_5;
|
||||||
|
}
|
||||||
|
|
||||||
|
h32 += (U32) len;
|
||||||
|
|
||||||
|
while (p+4<=bEnd)
|
||||||
|
{
|
||||||
|
h32 += XXH_get32bits(p) * PRIME32_3;
|
||||||
|
h32 = XXH_rotl32(h32, 17) * PRIME32_4 ;
|
||||||
|
p+=4;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (p<bEnd)
|
||||||
|
{
|
||||||
|
h32 += (*p) * PRIME32_5;
|
||||||
|
h32 = XXH_rotl32(h32, 11) * PRIME32_1 ;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
h32 ^= h32 >> 15;
|
||||||
|
h32 *= PRIME32_2;
|
||||||
|
h32 ^= h32 >> 13;
|
||||||
|
h32 *= PRIME32_3;
|
||||||
|
h32 ^= h32 >> 16;
|
||||||
|
|
||||||
|
return h32;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned int XXH32 (const void* input, size_t len, unsigned seed)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
// Simple version, good for code maintenance, but unfortunately slow for small inputs
|
||||||
|
XXH32_state_t state;
|
||||||
|
XXH32_reset(&state, seed);
|
||||||
|
XXH32_update(&state, input, len);
|
||||||
|
return XXH32_digest(&state);
|
||||||
|
#else
|
||||||
|
XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
|
||||||
|
|
||||||
|
# if !defined(XXH_USE_UNALIGNED_ACCESS)
|
||||||
|
if ((((size_t)input) & 3) == 0) // Input is aligned, let's leverage the speed advantage
|
||||||
|
{
|
||||||
|
if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
|
||||||
|
return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned);
|
||||||
|
else
|
||||||
|
return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned);
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
|
||||||
|
return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned);
|
||||||
|
else
|
||||||
|
return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
FORCE_INLINE U64 XXH64_endian_align(const void* input, size_t len, U64 seed, XXH_endianess endian, XXH_alignment align)
|
||||||
|
{
|
||||||
|
const BYTE* p = (const BYTE*)input;
|
||||||
|
const BYTE* bEnd = p + len;
|
||||||
|
U64 h64;
|
||||||
|
#define XXH_get64bits(p) XXH_readLE64_align(p, endian, align)
|
||||||
|
|
||||||
|
#ifdef XXH_ACCEPT_NULL_INPUT_POINTER
|
||||||
|
if (p==NULL)
|
||||||
|
{
|
||||||
|
len=0;
|
||||||
|
bEnd=p=(const BYTE*)(size_t)32;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (len>=32)
|
||||||
|
{
|
||||||
|
const BYTE* const limit = bEnd - 32;
|
||||||
|
U64 v1 = seed + PRIME64_1 + PRIME64_2;
|
||||||
|
U64 v2 = seed + PRIME64_2;
|
||||||
|
U64 v3 = seed + 0;
|
||||||
|
U64 v4 = seed - PRIME64_1;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
v1 += XXH_get64bits(p) * PRIME64_2;
|
||||||
|
p+=8;
|
||||||
|
v1 = XXH_rotl64(v1, 31);
|
||||||
|
v1 *= PRIME64_1;
|
||||||
|
v2 += XXH_get64bits(p) * PRIME64_2;
|
||||||
|
p+=8;
|
||||||
|
v2 = XXH_rotl64(v2, 31);
|
||||||
|
v2 *= PRIME64_1;
|
||||||
|
v3 += XXH_get64bits(p) * PRIME64_2;
|
||||||
|
p+=8;
|
||||||
|
v3 = XXH_rotl64(v3, 31);
|
||||||
|
v3 *= PRIME64_1;
|
||||||
|
v4 += XXH_get64bits(p) * PRIME64_2;
|
||||||
|
p+=8;
|
||||||
|
v4 = XXH_rotl64(v4, 31);
|
||||||
|
v4 *= PRIME64_1;
|
||||||
|
}
|
||||||
|
while (p<=limit);
|
||||||
|
|
||||||
|
h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18);
|
||||||
|
|
||||||
|
v1 *= PRIME64_2;
|
||||||
|
v1 = XXH_rotl64(v1, 31);
|
||||||
|
v1 *= PRIME64_1;
|
||||||
|
h64 ^= v1;
|
||||||
|
h64 = h64 * PRIME64_1 + PRIME64_4;
|
||||||
|
|
||||||
|
v2 *= PRIME64_2;
|
||||||
|
v2 = XXH_rotl64(v2, 31);
|
||||||
|
v2 *= PRIME64_1;
|
||||||
|
h64 ^= v2;
|
||||||
|
h64 = h64 * PRIME64_1 + PRIME64_4;
|
||||||
|
|
||||||
|
v3 *= PRIME64_2;
|
||||||
|
v3 = XXH_rotl64(v3, 31);
|
||||||
|
v3 *= PRIME64_1;
|
||||||
|
h64 ^= v3;
|
||||||
|
h64 = h64 * PRIME64_1 + PRIME64_4;
|
||||||
|
|
||||||
|
v4 *= PRIME64_2;
|
||||||
|
v4 = XXH_rotl64(v4, 31);
|
||||||
|
v4 *= PRIME64_1;
|
||||||
|
h64 ^= v4;
|
||||||
|
h64 = h64 * PRIME64_1 + PRIME64_4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
h64 = seed + PRIME64_5;
|
||||||
|
}
|
||||||
|
|
||||||
|
h64 += (U64) len;
|
||||||
|
|
||||||
|
while (p+8<=bEnd)
|
||||||
|
{
|
||||||
|
U64 k1 = XXH_get64bits(p);
|
||||||
|
k1 *= PRIME64_2;
|
||||||
|
k1 = XXH_rotl64(k1,31);
|
||||||
|
k1 *= PRIME64_1;
|
||||||
|
h64 ^= k1;
|
||||||
|
h64 = XXH_rotl64(h64,27) * PRIME64_1 + PRIME64_4;
|
||||||
|
p+=8;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p+4<=bEnd)
|
||||||
|
{
|
||||||
|
h64 ^= (U64)(XXH_get32bits(p)) * PRIME64_1;
|
||||||
|
h64 = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3;
|
||||||
|
p+=4;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (p<bEnd)
|
||||||
|
{
|
||||||
|
h64 ^= (*p) * PRIME64_5;
|
||||||
|
h64 = XXH_rotl64(h64, 11) * PRIME64_1;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
h64 ^= h64 >> 33;
|
||||||
|
h64 *= PRIME64_2;
|
||||||
|
h64 ^= h64 >> 29;
|
||||||
|
h64 *= PRIME64_3;
|
||||||
|
h64 ^= h64 >> 32;
|
||||||
|
|
||||||
|
return h64;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned long long XXH64 (const void* input, size_t len, unsigned long long seed)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
// Simple version, good for code maintenance, but unfortunately slow for small inputs
|
||||||
|
XXH64_state_t state;
|
||||||
|
XXH64_reset(&state, seed);
|
||||||
|
XXH64_update(&state, input, len);
|
||||||
|
return XXH64_digest(&state);
|
||||||
|
#else
|
||||||
|
XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
|
||||||
|
|
||||||
|
# if !defined(XXH_USE_UNALIGNED_ACCESS)
|
||||||
|
if ((((size_t)input) & 7)==0) // Input is aligned, let's leverage the speed advantage
|
||||||
|
{
|
||||||
|
if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
|
||||||
|
return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned);
|
||||||
|
else
|
||||||
|
return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned);
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
|
||||||
|
return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned);
|
||||||
|
else
|
||||||
|
return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************
|
||||||
|
* Advanced Hash Functions
|
||||||
|
****************************************************/
|
||||||
|
|
||||||
|
/*** Allocation ***/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
U64 total_len;
|
||||||
|
U32 seed;
|
||||||
|
U32 v1;
|
||||||
|
U32 v2;
|
||||||
|
U32 v3;
|
||||||
|
U32 v4;
|
||||||
|
U32 mem32[4]; /* defined as U32 for alignment */
|
||||||
|
U32 memsize;
|
||||||
|
} XXH_istate32_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
U64 total_len;
|
||||||
|
U64 seed;
|
||||||
|
U64 v1;
|
||||||
|
U64 v2;
|
||||||
|
U64 v3;
|
||||||
|
U64 v4;
|
||||||
|
U64 mem64[4]; /* defined as U64 for alignment */
|
||||||
|
U32 memsize;
|
||||||
|
} XXH_istate64_t;
|
||||||
|
|
||||||
|
|
||||||
|
XXH32_state_t* XXH32_createState(void)
|
||||||
|
{
|
||||||
|
static_assert(sizeof(XXH32_state_t) >= sizeof(XXH_istate32_t), ""); // A compilation error here means XXH32_state_t is not large enough
|
||||||
|
return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t));
|
||||||
|
}
|
||||||
|
XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr)
|
||||||
|
{
|
||||||
|
XXH_free(statePtr);
|
||||||
|
return XXH_OK;
|
||||||
|
};
|
||||||
|
|
||||||
|
XXH64_state_t* XXH64_createState(void)
|
||||||
|
{
|
||||||
|
static_assert(sizeof(XXH64_state_t) >= sizeof(XXH_istate64_t), ""); // A compilation error here means XXH64_state_t is not large enough
|
||||||
|
return (XXH64_state_t*)XXH_malloc(sizeof(XXH64_state_t));
|
||||||
|
}
|
||||||
|
XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr)
|
||||||
|
{
|
||||||
|
XXH_free(statePtr);
|
||||||
|
return XXH_OK;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*** Hash feed ***/
|
||||||
|
|
||||||
|
XXH_errorcode XXH32_reset(XXH32_state_t* state_in, U32 seed)
|
||||||
|
{
|
||||||
|
XXH_istate32_t* state = (XXH_istate32_t*) state_in;
|
||||||
|
state->seed = seed;
|
||||||
|
state->v1 = seed + PRIME32_1 + PRIME32_2;
|
||||||
|
state->v2 = seed + PRIME32_2;
|
||||||
|
state->v3 = seed + 0;
|
||||||
|
state->v4 = seed - PRIME32_1;
|
||||||
|
state->total_len = 0;
|
||||||
|
state->memsize = 0;
|
||||||
|
return XXH_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
XXH_errorcode XXH64_reset(XXH64_state_t* state_in, unsigned long long seed)
|
||||||
|
{
|
||||||
|
XXH_istate64_t* state = (XXH_istate64_t*) state_in;
|
||||||
|
state->seed = seed;
|
||||||
|
state->v1 = seed + PRIME64_1 + PRIME64_2;
|
||||||
|
state->v2 = seed + PRIME64_2;
|
||||||
|
state->v3 = seed + 0;
|
||||||
|
state->v4 = seed - PRIME64_1;
|
||||||
|
state->total_len = 0;
|
||||||
|
state->memsize = 0;
|
||||||
|
return XXH_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FORCE_INLINE XXH_errorcode XXH32_update_endian (XXH32_state_t* state_in, const void* input, size_t len, XXH_endianess endian)
|
||||||
|
{
|
||||||
|
XXH_istate32_t* state = (XXH_istate32_t *) state_in;
|
||||||
|
const BYTE* p = (const BYTE*)input;
|
||||||
|
const BYTE* const bEnd = p + len;
|
||||||
|
|
||||||
|
#ifdef XXH_ACCEPT_NULL_INPUT_POINTER
|
||||||
|
if (input==NULL) return XXH_ERROR;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
state->total_len += len;
|
||||||
|
|
||||||
|
if (state->memsize + len < 16) // fill in tmp buffer
|
||||||
|
{
|
||||||
|
XXH_memcpy((BYTE*)(state->mem32) + state->memsize, input, len);
|
||||||
|
state->memsize += (U32)len;
|
||||||
|
return XXH_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state->memsize) // some data left from previous update
|
||||||
|
{
|
||||||
|
XXH_memcpy((BYTE*)(state->mem32) + state->memsize, input, 16-state->memsize);
|
||||||
|
{
|
||||||
|
const U32* p32 = state->mem32;
|
||||||
|
state->v1 += XXH_readLE32(p32, endian) * PRIME32_2;
|
||||||
|
state->v1 = XXH_rotl32(state->v1, 13);
|
||||||
|
state->v1 *= PRIME32_1;
|
||||||
|
p32++;
|
||||||
|
state->v2 += XXH_readLE32(p32, endian) * PRIME32_2;
|
||||||
|
state->v2 = XXH_rotl32(state->v2, 13);
|
||||||
|
state->v2 *= PRIME32_1;
|
||||||
|
p32++;
|
||||||
|
state->v3 += XXH_readLE32(p32, endian) * PRIME32_2;
|
||||||
|
state->v3 = XXH_rotl32(state->v3, 13);
|
||||||
|
state->v3 *= PRIME32_1;
|
||||||
|
p32++;
|
||||||
|
state->v4 += XXH_readLE32(p32, endian) * PRIME32_2;
|
||||||
|
state->v4 = XXH_rotl32(state->v4, 13);
|
||||||
|
state->v4 *= PRIME32_1;
|
||||||
|
p32++;
|
||||||
|
}
|
||||||
|
p += 16-state->memsize;
|
||||||
|
state->memsize = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p <= bEnd-16)
|
||||||
|
{
|
||||||
|
const BYTE* const limit = bEnd - 16;
|
||||||
|
U32 v1 = state->v1;
|
||||||
|
U32 v2 = state->v2;
|
||||||
|
U32 v3 = state->v3;
|
||||||
|
U32 v4 = state->v4;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
v1 += XXH_readLE32(p, endian) * PRIME32_2;
|
||||||
|
v1 = XXH_rotl32(v1, 13);
|
||||||
|
v1 *= PRIME32_1;
|
||||||
|
p+=4;
|
||||||
|
v2 += XXH_readLE32(p, endian) * PRIME32_2;
|
||||||
|
v2 = XXH_rotl32(v2, 13);
|
||||||
|
v2 *= PRIME32_1;
|
||||||
|
p+=4;
|
||||||
|
v3 += XXH_readLE32(p, endian) * PRIME32_2;
|
||||||
|
v3 = XXH_rotl32(v3, 13);
|
||||||
|
v3 *= PRIME32_1;
|
||||||
|
p+=4;
|
||||||
|
v4 += XXH_readLE32(p, endian) * PRIME32_2;
|
||||||
|
v4 = XXH_rotl32(v4, 13);
|
||||||
|
v4 *= PRIME32_1;
|
||||||
|
p+=4;
|
||||||
|
}
|
||||||
|
while (p<=limit);
|
||||||
|
|
||||||
|
state->v1 = v1;
|
||||||
|
state->v2 = v2;
|
||||||
|
state->v3 = v3;
|
||||||
|
state->v4 = v4;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p < bEnd)
|
||||||
|
{
|
||||||
|
XXH_memcpy(state->mem32, p, bEnd-p);
|
||||||
|
state->memsize = (int)(bEnd-p);
|
||||||
|
}
|
||||||
|
|
||||||
|
return XXH_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
XXH_errorcode XXH32_update (XXH32_state_t* state_in, const void* input, size_t len)
|
||||||
|
{
|
||||||
|
XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
|
||||||
|
|
||||||
|
if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
|
||||||
|
return XXH32_update_endian(state_in, input, len, XXH_littleEndian);
|
||||||
|
else
|
||||||
|
return XXH32_update_endian(state_in, input, len, XXH_bigEndian);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FORCE_INLINE U32 XXH32_digest_endian (const XXH32_state_t* state_in, XXH_endianess endian)
|
||||||
|
{
|
||||||
|
XXH_istate32_t* state = (XXH_istate32_t*) state_in;
|
||||||
|
const BYTE * p = (const BYTE*)state->mem32;
|
||||||
|
BYTE* bEnd = (BYTE*)(state->mem32) + state->memsize;
|
||||||
|
U32 h32;
|
||||||
|
|
||||||
|
if (state->total_len >= 16)
|
||||||
|
{
|
||||||
|
h32 = XXH_rotl32(state->v1, 1) + XXH_rotl32(state->v2, 7) + XXH_rotl32(state->v3, 12) + XXH_rotl32(state->v4, 18);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
h32 = state->seed + PRIME32_5;
|
||||||
|
}
|
||||||
|
|
||||||
|
h32 += (U32) state->total_len;
|
||||||
|
|
||||||
|
while (p+4<=bEnd)
|
||||||
|
{
|
||||||
|
h32 += XXH_readLE32(p, endian) * PRIME32_3;
|
||||||
|
h32 = XXH_rotl32(h32, 17) * PRIME32_4;
|
||||||
|
p+=4;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (p<bEnd)
|
||||||
|
{
|
||||||
|
h32 += (*p) * PRIME32_5;
|
||||||
|
h32 = XXH_rotl32(h32, 11) * PRIME32_1;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
h32 ^= h32 >> 15;
|
||||||
|
h32 *= PRIME32_2;
|
||||||
|
h32 ^= h32 >> 13;
|
||||||
|
h32 *= PRIME32_3;
|
||||||
|
h32 ^= h32 >> 16;
|
||||||
|
|
||||||
|
return h32;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
U32 XXH32_digest (const XXH32_state_t* state_in)
|
||||||
|
{
|
||||||
|
XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
|
||||||
|
|
||||||
|
if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
|
||||||
|
return XXH32_digest_endian(state_in, XXH_littleEndian);
|
||||||
|
else
|
||||||
|
return XXH32_digest_endian(state_in, XXH_bigEndian);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FORCE_INLINE XXH_errorcode XXH64_update_endian (XXH64_state_t* state_in, const void* input, size_t len, XXH_endianess endian)
|
||||||
|
{
|
||||||
|
XXH_istate64_t * state = (XXH_istate64_t *) state_in;
|
||||||
|
const BYTE* p = (const BYTE*)input;
|
||||||
|
const BYTE* const bEnd = p + len;
|
||||||
|
|
||||||
|
#ifdef XXH_ACCEPT_NULL_INPUT_POINTER
|
||||||
|
if (input==NULL) return XXH_ERROR;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
state->total_len += len;
|
||||||
|
|
||||||
|
if (state->memsize + len < 32) // fill in tmp buffer
|
||||||
|
{
|
||||||
|
XXH_memcpy(((BYTE*)state->mem64) + state->memsize, input, len);
|
||||||
|
state->memsize += (U32)len;
|
||||||
|
return XXH_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state->memsize) // some data left from previous update
|
||||||
|
{
|
||||||
|
XXH_memcpy(((BYTE*)state->mem64) + state->memsize, input, 32-state->memsize);
|
||||||
|
{
|
||||||
|
const U64* p64 = state->mem64;
|
||||||
|
state->v1 += XXH_readLE64(p64, endian) * PRIME64_2;
|
||||||
|
state->v1 = XXH_rotl64(state->v1, 31);
|
||||||
|
state->v1 *= PRIME64_1;
|
||||||
|
p64++;
|
||||||
|
state->v2 += XXH_readLE64(p64, endian) * PRIME64_2;
|
||||||
|
state->v2 = XXH_rotl64(state->v2, 31);
|
||||||
|
state->v2 *= PRIME64_1;
|
||||||
|
p64++;
|
||||||
|
state->v3 += XXH_readLE64(p64, endian) * PRIME64_2;
|
||||||
|
state->v3 = XXH_rotl64(state->v3, 31);
|
||||||
|
state->v3 *= PRIME64_1;
|
||||||
|
p64++;
|
||||||
|
state->v4 += XXH_readLE64(p64, endian) * PRIME64_2;
|
||||||
|
state->v4 = XXH_rotl64(state->v4, 31);
|
||||||
|
state->v4 *= PRIME64_1;
|
||||||
|
p64++;
|
||||||
|
}
|
||||||
|
p += 32-state->memsize;
|
||||||
|
state->memsize = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p+32 <= bEnd)
|
||||||
|
{
|
||||||
|
const BYTE* const limit = bEnd - 32;
|
||||||
|
U64 v1 = state->v1;
|
||||||
|
U64 v2 = state->v2;
|
||||||
|
U64 v3 = state->v3;
|
||||||
|
U64 v4 = state->v4;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
v1 += XXH_readLE64(p, endian) * PRIME64_2;
|
||||||
|
v1 = XXH_rotl64(v1, 31);
|
||||||
|
v1 *= PRIME64_1;
|
||||||
|
p+=8;
|
||||||
|
v2 += XXH_readLE64(p, endian) * PRIME64_2;
|
||||||
|
v2 = XXH_rotl64(v2, 31);
|
||||||
|
v2 *= PRIME64_1;
|
||||||
|
p+=8;
|
||||||
|
v3 += XXH_readLE64(p, endian) * PRIME64_2;
|
||||||
|
v3 = XXH_rotl64(v3, 31);
|
||||||
|
v3 *= PRIME64_1;
|
||||||
|
p+=8;
|
||||||
|
v4 += XXH_readLE64(p, endian) * PRIME64_2;
|
||||||
|
v4 = XXH_rotl64(v4, 31);
|
||||||
|
v4 *= PRIME64_1;
|
||||||
|
p+=8;
|
||||||
|
}
|
||||||
|
while (p<=limit);
|
||||||
|
|
||||||
|
state->v1 = v1;
|
||||||
|
state->v2 = v2;
|
||||||
|
state->v3 = v3;
|
||||||
|
state->v4 = v4;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p < bEnd)
|
||||||
|
{
|
||||||
|
XXH_memcpy(state->mem64, p, bEnd-p);
|
||||||
|
state->memsize = (int)(bEnd-p);
|
||||||
|
}
|
||||||
|
|
||||||
|
return XXH_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
XXH_errorcode XXH64_update (XXH64_state_t* state_in, const void* input, size_t len)
|
||||||
|
{
|
||||||
|
XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
|
||||||
|
|
||||||
|
if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
|
||||||
|
return XXH64_update_endian(state_in, input, len, XXH_littleEndian);
|
||||||
|
else
|
||||||
|
return XXH64_update_endian(state_in, input, len, XXH_bigEndian);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FORCE_INLINE U64 XXH64_digest_endian (const XXH64_state_t* state_in, XXH_endianess endian)
|
||||||
|
{
|
||||||
|
XXH_istate64_t * state = (XXH_istate64_t *) state_in;
|
||||||
|
const BYTE * p = (const BYTE*)state->mem64;
|
||||||
|
BYTE* bEnd = (BYTE*)state->mem64 + state->memsize;
|
||||||
|
U64 h64;
|
||||||
|
|
||||||
|
if (state->total_len >= 32)
|
||||||
|
{
|
||||||
|
U64 v1 = state->v1;
|
||||||
|
U64 v2 = state->v2;
|
||||||
|
U64 v3 = state->v3;
|
||||||
|
U64 v4 = state->v4;
|
||||||
|
|
||||||
|
h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18);
|
||||||
|
|
||||||
|
v1 *= PRIME64_2;
|
||||||
|
v1 = XXH_rotl64(v1, 31);
|
||||||
|
v1 *= PRIME64_1;
|
||||||
|
h64 ^= v1;
|
||||||
|
h64 = h64*PRIME64_1 + PRIME64_4;
|
||||||
|
|
||||||
|
v2 *= PRIME64_2;
|
||||||
|
v2 = XXH_rotl64(v2, 31);
|
||||||
|
v2 *= PRIME64_1;
|
||||||
|
h64 ^= v2;
|
||||||
|
h64 = h64*PRIME64_1 + PRIME64_4;
|
||||||
|
|
||||||
|
v3 *= PRIME64_2;
|
||||||
|
v3 = XXH_rotl64(v3, 31);
|
||||||
|
v3 *= PRIME64_1;
|
||||||
|
h64 ^= v3;
|
||||||
|
h64 = h64*PRIME64_1 + PRIME64_4;
|
||||||
|
|
||||||
|
v4 *= PRIME64_2;
|
||||||
|
v4 = XXH_rotl64(v4, 31);
|
||||||
|
v4 *= PRIME64_1;
|
||||||
|
h64 ^= v4;
|
||||||
|
h64 = h64*PRIME64_1 + PRIME64_4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
h64 = state->seed + PRIME64_5;
|
||||||
|
}
|
||||||
|
|
||||||
|
h64 += (U64) state->total_len;
|
||||||
|
|
||||||
|
while (p+8<=bEnd)
|
||||||
|
{
|
||||||
|
U64 k1 = XXH_readLE64(p, endian);
|
||||||
|
k1 *= PRIME64_2;
|
||||||
|
k1 = XXH_rotl64(k1,31);
|
||||||
|
k1 *= PRIME64_1;
|
||||||
|
h64 ^= k1;
|
||||||
|
h64 = XXH_rotl64(h64,27) * PRIME64_1 + PRIME64_4;
|
||||||
|
p+=8;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p+4<=bEnd)
|
||||||
|
{
|
||||||
|
h64 ^= (U64)(XXH_readLE32(p, endian)) * PRIME64_1;
|
||||||
|
h64 = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3;
|
||||||
|
p+=4;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (p<bEnd)
|
||||||
|
{
|
||||||
|
h64 ^= (*p) * PRIME64_5;
|
||||||
|
h64 = XXH_rotl64(h64, 11) * PRIME64_1;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
h64 ^= h64 >> 33;
|
||||||
|
h64 *= PRIME64_2;
|
||||||
|
h64 ^= h64 >> 29;
|
||||||
|
h64 *= PRIME64_3;
|
||||||
|
h64 ^= h64 >> 32;
|
||||||
|
|
||||||
|
return h64;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned long long XXH64_digest (const XXH64_state_t* state_in)
|
||||||
|
{
|
||||||
|
XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
|
||||||
|
|
||||||
|
if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
|
||||||
|
return XXH64_digest_endian(state_in, XXH_littleEndian);
|
||||||
|
else
|
||||||
|
return XXH64_digest_endian(state_in, XXH_bigEndian);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // detail
|
||||||
|
} // beast
|
||||||
154
src/beast/beast/hash/impl/xxhash.h
Normal file
154
src/beast/beast/hash/impl/xxhash.h
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
/*
|
||||||
|
xxHash - Extremely Fast Hash algorithm
|
||||||
|
Header File
|
||||||
|
Copyright (C) 2012-2014, Yann Collet.
|
||||||
|
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
You can contact the author at :
|
||||||
|
- xxHash source repository : http://code.google.com/p/xxhash/
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Notice extracted from xxHash homepage :
|
||||||
|
|
||||||
|
xxHash is an extremely fast Hash algorithm, running at RAM speed limits.
|
||||||
|
It also successfully passes all tests from the SMHasher suite.
|
||||||
|
|
||||||
|
Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo @3GHz)
|
||||||
|
|
||||||
|
Name Speed Q.Score Author
|
||||||
|
xxHash 5.4 GB/s 10
|
||||||
|
CrapWow 3.2 GB/s 2 Andrew
|
||||||
|
MumurHash 3a 2.7 GB/s 10 Austin Appleby
|
||||||
|
SpookyHash 2.0 GB/s 10 Bob Jenkins
|
||||||
|
SBox 1.4 GB/s 9 Bret Mulvey
|
||||||
|
Lookup3 1.2 GB/s 9 Bob Jenkins
|
||||||
|
SuperFastHash 1.2 GB/s 1 Paul Hsieh
|
||||||
|
CityHash64 1.05 GB/s 10 Pike & Alakuijala
|
||||||
|
FNV 0.55 GB/s 5 Fowler, Noll, Vo
|
||||||
|
CRC32 0.43 GB/s 9
|
||||||
|
MD5-32 0.33 GB/s 10 Ronald L. Rivest
|
||||||
|
SHA1-32 0.28 GB/s 10
|
||||||
|
|
||||||
|
Q.Score is a measure of quality of the hash function.
|
||||||
|
It depends on successfully passing SMHasher test set.
|
||||||
|
10 is a perfect score.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BEAST_CONTAINER_XXHASH_H_INCLUDED
|
||||||
|
#define BEAST_CONTAINER_XXHASH_H_INCLUDED
|
||||||
|
|
||||||
|
/*****************************
|
||||||
|
Includes
|
||||||
|
*****************************/
|
||||||
|
#include <stddef.h> /* size_t */
|
||||||
|
|
||||||
|
namespace beast {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
/*****************************
|
||||||
|
Type
|
||||||
|
*****************************/
|
||||||
|
typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************
|
||||||
|
Simple Hash Functions
|
||||||
|
*****************************/
|
||||||
|
|
||||||
|
unsigned int XXH32 (const void* input, size_t length, unsigned seed);
|
||||||
|
unsigned long long XXH64 (const void* input, size_t length, unsigned long long seed);
|
||||||
|
|
||||||
|
/*
|
||||||
|
XXH32() :
|
||||||
|
Calculate the 32-bits hash of sequence "length" bytes stored at memory address "input".
|
||||||
|
The memory between input & input+length must be valid (allocated and read-accessible).
|
||||||
|
"seed" can be used to alter the result predictably.
|
||||||
|
This function successfully passes all SMHasher tests.
|
||||||
|
Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark) : 5.4 GB/s
|
||||||
|
XXH64() :
|
||||||
|
Calculate the 64-bits hash of sequence of length "len" stored at memory address "input".
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************
|
||||||
|
Advanced Hash Functions
|
||||||
|
*****************************/
|
||||||
|
typedef struct { long long ll[ 6]; } XXH32_state_t;
|
||||||
|
typedef struct { long long ll[11]; } XXH64_state_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
These structures allow static allocation of XXH states.
|
||||||
|
States must then be initialized using XXHnn_reset() before first use.
|
||||||
|
|
||||||
|
If you prefer dynamic allocation, please refer to functions below.
|
||||||
|
*/
|
||||||
|
|
||||||
|
XXH32_state_t* XXH32_createState(void);
|
||||||
|
XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr);
|
||||||
|
|
||||||
|
XXH64_state_t* XXH64_createState(void);
|
||||||
|
XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr);
|
||||||
|
|
||||||
|
/*
|
||||||
|
These functions create and release memory for XXH state.
|
||||||
|
States must then be initialized using XXHnn_reset() before first use.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
XXH_errorcode XXH32_reset (XXH32_state_t* statePtr, unsigned seed);
|
||||||
|
XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length);
|
||||||
|
unsigned int XXH32_digest (const XXH32_state_t* statePtr);
|
||||||
|
|
||||||
|
XXH_errorcode XXH64_reset (XXH64_state_t* statePtr, unsigned long long seed);
|
||||||
|
XXH_errorcode XXH64_update (XXH64_state_t* statePtr, const void* input, size_t length);
|
||||||
|
unsigned long long XXH64_digest (const XXH64_state_t* statePtr);
|
||||||
|
|
||||||
|
/*
|
||||||
|
These functions calculate the xxHash of an input provided in multiple smaller packets,
|
||||||
|
as opposed to an input provided as a single block.
|
||||||
|
|
||||||
|
XXH state space must first be allocated, using either static or dynamic method provided above.
|
||||||
|
|
||||||
|
Start a new hash by initializing state with a seed, using XXHnn_reset().
|
||||||
|
|
||||||
|
Then, feed the hash state by calling XXHnn_update() as many times as necessary.
|
||||||
|
Obviously, input must be valid, meaning allocated and read accessible.
|
||||||
|
The function returns an error code, with 0 meaning OK, and any other value meaning there is an error.
|
||||||
|
|
||||||
|
Finally, you can produce a hash anytime, by using XXHnn_digest().
|
||||||
|
This function returns the final nn-bits hash.
|
||||||
|
You can nonetheless continue feeding the hash state with more input,
|
||||||
|
and therefore get some new hashes, by calling again XXHnn_digest().
|
||||||
|
|
||||||
|
When you are done, don't forget to free XXH state space, using typically XXHnn_freeState().
|
||||||
|
*/
|
||||||
|
|
||||||
|
} // detail
|
||||||
|
} // beast
|
||||||
|
|
||||||
|
#endif
|
||||||
59
src/beast/beast/hash/siphash.h
Normal file
59
src/beast/beast/hash/siphash.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of Beast: https://github.com/vinniefalco/Beast
|
||||||
|
Copyright 2014, Howard Hinnant <howard.hinnant@gmail.com>,
|
||||||
|
Vinnie Falco <vinnie.falco@gmail.com
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#ifndef BEAST_HASH_SIPHASH_H_INCLUDED
|
||||||
|
#define BEAST_HASH_SIPHASH_H_INCLUDED
|
||||||
|
|
||||||
|
#include <beast/utility/noexcept.h>
|
||||||
|
#include <cstddef>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
namespace beast {
|
||||||
|
|
||||||
|
// See https://131002.net/siphash/
|
||||||
|
class siphash
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
std::uint64_t v0_ = 0x736f6d6570736575ULL;
|
||||||
|
std::uint64_t v1_ = 0x646f72616e646f6dULL;
|
||||||
|
std::uint64_t v2_ = 0x6c7967656e657261ULL;
|
||||||
|
std::uint64_t v3_ = 0x7465646279746573ULL;
|
||||||
|
unsigned char buf_[8];
|
||||||
|
unsigned bufsize_ = 0;
|
||||||
|
unsigned total_length_ = 0;
|
||||||
|
|
||||||
|
public:
|
||||||
|
using result_type = std::size_t;
|
||||||
|
|
||||||
|
siphash() = default;
|
||||||
|
|
||||||
|
explicit
|
||||||
|
siphash (std::uint64_t k0, std::uint64_t k1 = 0) noexcept;
|
||||||
|
|
||||||
|
void
|
||||||
|
append (void const* key, std::size_t len) noexcept;
|
||||||
|
|
||||||
|
explicit
|
||||||
|
operator std::size_t() noexcept;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // beast
|
||||||
|
|
||||||
|
#endif
|
||||||
59
src/beast/beast/hash/spooky.h
Normal file
59
src/beast/beast/hash/spooky.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of Beast: https://github.com/vinniefalco/Beast
|
||||||
|
Copyright 2014, Howard Hinnant <howard.hinnant@gmail.com>,
|
||||||
|
Vinnie Falco <vinnie.falco@gmail.com
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#ifndef BEAST_HASH_SPOOKY_H_INCLUDED
|
||||||
|
#define BEAST_HASH_SPOOKY_H_INCLUDED
|
||||||
|
|
||||||
|
#include <beast/hash/impl/spookyv2.h>
|
||||||
|
|
||||||
|
namespace beast {
|
||||||
|
|
||||||
|
// See http://burtleburtle.net/bob/hash/spooky.html
|
||||||
|
class spooky
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
SpookyHash state_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
using result_type = std::size_t;
|
||||||
|
|
||||||
|
spooky (std::size_t seed1 = 1, std::size_t seed2 = 2) noexcept
|
||||||
|
{
|
||||||
|
state_.Init (seed1, seed2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
append (void const* key, std::size_t len) noexcept
|
||||||
|
{
|
||||||
|
state_.Update (key, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit
|
||||||
|
operator std::size_t() noexcept
|
||||||
|
{
|
||||||
|
std::uint64_t h1, h2;
|
||||||
|
state_.Final (&h1, &h2);
|
||||||
|
return static_cast <std::size_t> (h1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // beast
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -17,21 +17,15 @@
|
|||||||
*/
|
*/
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
|
||||||
// MODULES: ../impl/spookyv2.cpp
|
|
||||||
|
|
||||||
#if BEAST_INCLUDE_BEASTCONFIG
|
#if BEAST_INCLUDE_BEASTCONFIG
|
||||||
#include <BeastConfig.h>
|
#include <BeastConfig.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <beast/container/tests/hash_metrics.h>
|
#include <beast/hash/tests/hash_metrics.h>
|
||||||
|
#include <beast/hash/hash_append.h>
|
||||||
#include <beast/container/hash_append.h>
|
|
||||||
#include <beast/container/impl/spookyv2.h>
|
|
||||||
|
|
||||||
#include <beast/chrono/chrono_io.h>
|
#include <beast/chrono/chrono_io.h>
|
||||||
#include <beast/unit_test/suite.h>
|
#include <beast/unit_test/suite.h>
|
||||||
#include <beast/utility/type_name.h>
|
#include <beast/utility/type_name.h>
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
@@ -40,8 +34,6 @@
|
|||||||
|
|
||||||
namespace beast {
|
namespace beast {
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
template <class Block, class Derived>
|
template <class Block, class Derived>
|
||||||
class block_stream
|
class block_stream
|
||||||
{
|
{
|
||||||
86
src/beast/beast/hash/tests/hash_speed_test.cpp
Normal file
86
src/beast/beast/hash/tests/hash_speed_test.cpp
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of Beast: https://github.com/vinniefalco/Beast
|
||||||
|
Copyright 2013, Vinnie Falco <vinnie.falco@gmail.com>
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#if BEAST_INCLUDE_BEASTCONFIG
|
||||||
|
#include <BeastConfig.h>
|
||||||
|
#endif
|
||||||
|
#include <beast/hash/fnv1a.h>
|
||||||
|
#include <beast/hash/siphash.h>
|
||||||
|
#include <beast/hash/xxhasher.h>
|
||||||
|
#include <beast/chrono/chrono_io.h>
|
||||||
|
#include <beast/random/rngfill.h>
|
||||||
|
#include <beast/random/xor_shift_engine.h>
|
||||||
|
#include <beast/unit_test/suite.h>
|
||||||
|
#include <array>
|
||||||
|
#include <chrono>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstring>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <random>
|
||||||
|
|
||||||
|
namespace beast {
|
||||||
|
|
||||||
|
class hash_speed_test : public beast::unit_test::suite
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using clock_type =
|
||||||
|
std::chrono::high_resolution_clock;
|
||||||
|
template <class Hasher, std::size_t KeySize>
|
||||||
|
void
|
||||||
|
test (std::string const& what, std::size_t n)
|
||||||
|
{
|
||||||
|
using namespace std;
|
||||||
|
using namespace std::chrono;
|
||||||
|
xor_shift_engine g(1);
|
||||||
|
array<std::uint8_t, KeySize> key;
|
||||||
|
auto const start = clock_type::now();
|
||||||
|
while(n--)
|
||||||
|
{
|
||||||
|
rngfill (key, g);
|
||||||
|
Hasher h;
|
||||||
|
h.append(key.data(), KeySize);
|
||||||
|
volatile size_t temp =
|
||||||
|
static_cast<std::size_t>(h);
|
||||||
|
(void)temp;
|
||||||
|
}
|
||||||
|
auto const elapsed = clock_type::now() - start;
|
||||||
|
log << setw(12) << what << " " <<
|
||||||
|
duration<double>(elapsed) << "s";
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
run()
|
||||||
|
{
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
N = 100000000
|
||||||
|
};
|
||||||
|
|
||||||
|
#if ! BEAST_NO_XXHASH
|
||||||
|
test<xxhasher,32> ("xxhash", N);
|
||||||
|
#endif
|
||||||
|
test<fnv1a,32> ("fnv1a", N);
|
||||||
|
test<siphash,32> ("siphash", N);
|
||||||
|
pass();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
BEAST_DEFINE_TESTSUITE_MANUAL(hash_speed,container,beast);
|
||||||
|
|
||||||
|
} // beast
|
||||||
46
src/beast/beast/hash/uhash.h
Normal file
46
src/beast/beast/hash/uhash.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of Beast: https://github.com/vinniefalco/Beast
|
||||||
|
Copyright 2014, Howard Hinnant <howard.hinnant@gmail.com>,
|
||||||
|
Vinnie Falco <vinnie.falco@gmail.com
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#ifndef BEAST_HASH_UHASH_H_INCLUDED
|
||||||
|
#define BEAST_HASH_UHASH_H_INCLUDED
|
||||||
|
|
||||||
|
#include <beast/hash/spooky.h>
|
||||||
|
|
||||||
|
namespace beast {
|
||||||
|
|
||||||
|
// Universal hash function
|
||||||
|
template <class Hasher = spooky>
|
||||||
|
struct uhash
|
||||||
|
{
|
||||||
|
using result_type = typename Hasher::result_type;
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
result_type
|
||||||
|
operator()(T const& t) const noexcept
|
||||||
|
{
|
||||||
|
Hasher h;
|
||||||
|
hash_append (h, t);
|
||||||
|
return static_cast<result_type>(h);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // beast
|
||||||
|
|
||||||
|
#endif
|
||||||
86
src/beast/beast/hash/xxhasher.h
Normal file
86
src/beast/beast/hash/xxhasher.h
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of Beast: https://github.com/vinniefalco/Beast
|
||||||
|
Copyright 2014, Vinnie Falco <vinnie.falco@gmail.com>
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#ifndef BEAST_HASH_XXHASHER_H_INCLUDED
|
||||||
|
#define BEAST_HASH_XXHASHER_H_INCLUDED
|
||||||
|
|
||||||
|
#ifndef BEAST_NO_XXHASH
|
||||||
|
#define BEAST_NO_XXHASH 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ! BEAST_NO_XXHASH
|
||||||
|
|
||||||
|
#include <beast/hash/impl/xxhash.h>
|
||||||
|
#include <beast/utility/noexcept.h>
|
||||||
|
#include <beast/cxx14/type_traits.h> // <type_traits>
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
|
namespace beast {
|
||||||
|
|
||||||
|
class xxhasher
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
// requires 64-bit std::size_t
|
||||||
|
static_assert(sizeof(std::size_t)==8, "");
|
||||||
|
|
||||||
|
detail::XXH64_state_t state_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
using result_type = std::size_t;
|
||||||
|
|
||||||
|
xxhasher() noexcept
|
||||||
|
{
|
||||||
|
detail::XXH64_reset (&state_, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Seed,
|
||||||
|
std::enable_if_t<
|
||||||
|
std::is_unsigned<Seed>::value>* = nullptr>
|
||||||
|
explicit
|
||||||
|
xxhasher (Seed seed)
|
||||||
|
{
|
||||||
|
detail::XXH64_reset (&state_, seed);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Seed,
|
||||||
|
std::enable_if_t<
|
||||||
|
std::is_unsigned<Seed>::value>* = nullptr>
|
||||||
|
xxhasher (Seed seed, Seed)
|
||||||
|
{
|
||||||
|
detail::XXH64_reset (&state_, seed);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
append (void const* key, std::size_t len) noexcept
|
||||||
|
{
|
||||||
|
detail::XXH64_update (&state_, key, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit
|
||||||
|
operator std::size_t() noexcept
|
||||||
|
{
|
||||||
|
return detail::XXH64_digest(&state_);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // beast
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -18,8 +18,8 @@
|
|||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <beast/hash/uhash.h>
|
||||||
#include <beast/cxx14/memory.h>
|
#include <beast/cxx14/memory.h> // <memory>
|
||||||
|
|
||||||
namespace beast {
|
namespace beast {
|
||||||
namespace insight {
|
namespace insight {
|
||||||
|
|||||||
@@ -22,8 +22,8 @@
|
|||||||
|
|
||||||
#include <beast/net/IPAddressV4.h>
|
#include <beast/net/IPAddressV4.h>
|
||||||
#include <beast/net/IPAddressV6.h>
|
#include <beast/net/IPAddressV6.h>
|
||||||
#include <beast/container/hash_append.h>
|
#include <beast/hash/hash_append.h>
|
||||||
|
#include <beast/hash/uhash.h>
|
||||||
#include <boost/functional/hash.hpp>
|
#include <boost/functional/hash.hpp>
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
#ifndef BEAST_NET_IPADDRESSV4_H_INCLUDED
|
#ifndef BEAST_NET_IPADDRESSV4_H_INCLUDED
|
||||||
#define BEAST_NET_IPADDRESSV4_H_INCLUDED
|
#define BEAST_NET_IPADDRESSV4_H_INCLUDED
|
||||||
|
|
||||||
#include <beast/container/hash_append.h>
|
#include <beast/hash/hash_append.h>
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|||||||
@@ -21,8 +21,8 @@
|
|||||||
#define BEAST_NET_IPENDPOINT_H_INCLUDED
|
#define BEAST_NET_IPENDPOINT_H_INCLUDED
|
||||||
|
|
||||||
#include <beast/net/IPAddress.h>
|
#include <beast/net/IPAddress.h>
|
||||||
#include <beast/container/hash_append.h>
|
#include <beast/hash/hash_append.h>
|
||||||
|
#include <beast/hash/uhash.h>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <ios>
|
#include <ios>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|||||||
29
src/beast/beast/unity/hash_unity.cpp
Normal file
29
src/beast/beast/unity/hash_unity.cpp
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of Beast: https://github.com/vinniefalco/Beast
|
||||||
|
Copyright 2013, Vinnie Falco <vinnie.falco@gmail.com>
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#include <beast/hash/xxhasher.h>
|
||||||
|
#include <beast/hash/impl/spookyv2.cpp>
|
||||||
|
|
||||||
|
#if ! BEAST_NO_XXHASH
|
||||||
|
#include <beast/hash/impl/xxhash.c>
|
||||||
|
#endif
|
||||||
|
#include <beast/hash/impl/siphash.cpp>
|
||||||
|
|
||||||
|
#include <beast/hash/tests/hash_append_test.cpp>
|
||||||
|
#include <beast/hash/tests/hash_speed_test.cpp>
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
#ifndef BEAST_UTILITY_TAGGED_INTEGER_H_INCLUDED
|
#ifndef BEAST_UTILITY_TAGGED_INTEGER_H_INCLUDED
|
||||||
#define BEAST_UTILITY_TAGGED_INTEGER_H_INCLUDED
|
#define BEAST_UTILITY_TAGGED_INTEGER_H_INCLUDED
|
||||||
|
|
||||||
#include <beast/container/hash_append.h>
|
#include <beast/hash/hash_append.h>
|
||||||
|
|
||||||
#include <beast/utility/noexcept.h>
|
#include <beast/utility/noexcept.h>
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
#include <beast/chrono/abstract_clock.h>
|
#include <beast/chrono/abstract_clock.h>
|
||||||
#include <beast/chrono/chrono_io.h>
|
#include <beast/chrono/chrono_io.h>
|
||||||
#include <beast/Insight.h>
|
#include <beast/Insight.h>
|
||||||
#include <beast/container/hardened_hash.h>
|
#include <beast/hash/hardened_hash.h>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
namespace ripple {
|
namespace ripple {
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
#include <beast/chrono/abstract_clock.h>
|
#include <beast/chrono/abstract_clock.h>
|
||||||
#include <beast/chrono/chrono_io.h>
|
#include <beast/chrono/chrono_io.h>
|
||||||
#include <beast/Insight.h>
|
#include <beast/Insight.h>
|
||||||
#include <beast/container/hardened_hash.h>
|
#include <beast/hash/hardened_hash.h>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|||||||
@@ -20,8 +20,10 @@
|
|||||||
#ifndef RIPPLE_BASICS_UNORDERED_CONTAINERS_H_INCLUDED
|
#ifndef RIPPLE_BASICS_UNORDERED_CONTAINERS_H_INCLUDED
|
||||||
#define RIPPLE_BASICS_UNORDERED_CONTAINERS_H_INCLUDED
|
#define RIPPLE_BASICS_UNORDERED_CONTAINERS_H_INCLUDED
|
||||||
|
|
||||||
#include <beast/container/hardened_hash.h>
|
#include <beast/hash/hardened_hash.h>
|
||||||
#include <beast/container/hash_append.h>
|
#include <beast/hash/hash_append.h>
|
||||||
|
#include <beast/hash/uhash.h>
|
||||||
|
#include <beast/hash/xxhasher.h>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
|
|
||||||
@@ -63,22 +65,24 @@ using hash_multiset = std::unordered_multiset <Value, Hash, Pred, Allocator>;
|
|||||||
|
|
||||||
// hardened_hash containers
|
// hardened_hash containers
|
||||||
|
|
||||||
template <class Key, class Value, class Hash = beast::hardened_hash<>,
|
using strong_hash = beast::xxhasher;
|
||||||
|
|
||||||
|
template <class Key, class Value, class Hash = beast::hardened_hash<strong_hash>,
|
||||||
class Pred = std::equal_to<Key>,
|
class Pred = std::equal_to<Key>,
|
||||||
class Allocator = std::allocator<std::pair<Key const, Value>>>
|
class Allocator = std::allocator<std::pair<Key const, Value>>>
|
||||||
using hardened_hash_map = std::unordered_map <Key, Value, Hash, Pred, Allocator>;
|
using hardened_hash_map = std::unordered_map <Key, Value, Hash, Pred, Allocator>;
|
||||||
|
|
||||||
template <class Key, class Value, class Hash = beast::hardened_hash<>,
|
template <class Key, class Value, class Hash = beast::hardened_hash<strong_hash>,
|
||||||
class Pred = std::equal_to<Key>,
|
class Pred = std::equal_to<Key>,
|
||||||
class Allocator = std::allocator<std::pair<Key const, Value>>>
|
class Allocator = std::allocator<std::pair<Key const, Value>>>
|
||||||
using hardened_hash_multimap = std::unordered_multimap <Key, Value, Hash, Pred, Allocator>;
|
using hardened_hash_multimap = std::unordered_multimap <Key, Value, Hash, Pred, Allocator>;
|
||||||
|
|
||||||
template <class Value, class Hash = beast::hardened_hash<>,
|
template <class Value, class Hash = beast::hardened_hash<strong_hash>,
|
||||||
class Pred = std::equal_to<Value>,
|
class Pred = std::equal_to<Value>,
|
||||||
class Allocator = std::allocator<Value>>
|
class Allocator = std::allocator<Value>>
|
||||||
using hardened_hash_set = std::unordered_set <Value, Hash, Pred, Allocator>;
|
using hardened_hash_set = std::unordered_set <Value, Hash, Pred, Allocator>;
|
||||||
|
|
||||||
template <class Value, class Hash = beast::hardened_hash<>,
|
template <class Value, class Hash = beast::hardened_hash<strong_hash>,
|
||||||
class Pred = std::equal_to<Value>,
|
class Pred = std::equal_to<Value>,
|
||||||
class Allocator = std::allocator<Value>>
|
class Allocator = std::allocator<Value>>
|
||||||
using hardened_hash_multiset = std::unordered_multiset <Value, Hash, Pred, Allocator>;
|
using hardened_hash_multiset = std::unordered_multiset <Value, Hash, Pred, Allocator>;
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
#include <ripple/basics/Blob.h>
|
#include <ripple/basics/Blob.h>
|
||||||
#include <ripple/basics/strHex.h>
|
#include <ripple/basics/strHex.h>
|
||||||
|
|
||||||
#include <beast/container/hardened_hash.h>
|
#include <beast/hash/hardened_hash.h>
|
||||||
#include <beast/utility/Zero.h>
|
#include <beast/utility/Zero.h>
|
||||||
|
|
||||||
#include <boost/functional/hash.hpp>
|
#include <boost/functional/hash.hpp>
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
#include <ripple/protocol/RippleAddress.h>
|
#include <ripple/protocol/RippleAddress.h>
|
||||||
#include <ripple/validators/Connection.h>
|
#include <ripple/validators/Connection.h>
|
||||||
#include <ripple/validators/impl/Logic.h>
|
#include <ripple/validators/impl/Logic.h>
|
||||||
#include <beast/container/hardened_hash.h>
|
#include <beast/hash/hardened_hash.h>
|
||||||
#include <beast/utility/WrappedSink.h>
|
#include <beast/utility/WrappedSink.h>
|
||||||
#include <boost/container/flat_map.hpp>
|
#include <boost/container/flat_map.hpp>
|
||||||
#include <boost/container/flat_set.hpp>
|
#include <boost/container/flat_set.hpp>
|
||||||
|
|||||||
Reference in New Issue
Block a user