diff --git a/Builds/VisualStudio2013/RippleD.vcxproj b/Builds/VisualStudio2013/RippleD.vcxproj
index f0773bc669..84ce29f554 100644
--- a/Builds/VisualStudio2013/RippleD.vcxproj
+++ b/Builds/VisualStudio2013/RippleD.vcxproj
@@ -247,32 +247,12 @@
-
-
-
-
-
- True
-
-
- True
-
-
-
True
True
-
- True
-
-
- True
-
-
-
@@ -311,6 +291,37 @@
+
+
+
+
+
+ True
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
@@ -794,6 +805,8 @@
True
+
+
@@ -891,6 +904,8 @@
+
+
diff --git a/Builds/VisualStudio2013/RippleD.vcxproj.filters b/Builds/VisualStudio2013/RippleD.vcxproj.filters
index 1bc2255994..a1da343033 100644
--- a/Builds/VisualStudio2013/RippleD.vcxproj.filters
+++ b/Builds/VisualStudio2013/RippleD.vcxproj.filters
@@ -37,9 +37,6 @@
{B3ABC912-8DA0-AA35-302C-A0C614EDFDCE}
-
- {3B2EC044-6A81-F182-B783-B6D14DED827C}
-
{558F281D-B411-3676-A0DE-4B8C0D3B53A0}
@@ -61,6 +58,15 @@
{96F8CA0B-80D3-8AEA-EE13-B39EE1CF91B0}
+
+ {FE3C8FFD-FEE1-BDEA-DE7F-24A8DEDCAD20}
+
+
+ {5D0A694C-9709-709C-EDCB-4332E2457AE4}
+
+
+ {2B06CD3F-1F3C-7832-DB4E-112BDCE74C94}
+
{7138D215-DA65-98D5-EF7D-C9896685201E}
@@ -187,6 +193,9 @@
{E8A9A46E-3151-7072-ADF1-C230D86E9791}
+
+ {40FDA51E-20C4-4A72-83C3-A4B08C596A82}
+
{2762284D-66E5-8B48-1F8E-67116DB1FC6B}
@@ -756,36 +765,12 @@
beast\container\detail
-
- beast\container
-
-
- beast\container
-
-
- beast\container\impl
-
-
- beast\container\impl
-
-
- beast\container\impl
-
beast\container\tests
beast\container\tests
-
- beast\container\tests
-
-
- beast\container\tests
-
-
- beast\container\tests
-
beast\crypto
@@ -834,6 +819,45 @@
beast\cxx14
+
+ beast\hash
+
+
+ beast\hash
+
+
+ beast\hash\impl
+
+
+ beast\hash\impl
+
+
+ beast\hash\impl
+
+
+ beast\hash\impl
+
+
+ beast\hash\impl
+
+
+ beast\hash
+
+
+ beast\hash
+
+
+ beast\hash\tests
+
+
+ beast\hash\tests
+
+
+ beast\hash\tests
+
+
+ beast\hash
+
beast
@@ -1434,6 +1458,9 @@
beast\net\tests
+
+ beast\random
+
beast\random
@@ -1563,6 +1590,9 @@
beast\threads
+
+ beast\unity
+
beast
diff --git a/SConstruct b/SConstruct
index 015bfa48c7..91eb6caf98 100644
--- a/SConstruct
+++ b/SConstruct
@@ -642,6 +642,7 @@ for tu_style in ['classic', 'unity']:
**git_commit_tag)
object_builder.add_source_files(
+ 'src/beast/beast/unity/hash_unity.cpp',
'src/ripple/unity/beast.cpp',
'src/ripple/unity/protobuf.cpp',
'src/ripple/unity/ripple.proto.cpp',
diff --git a/src/beast/beast/container/Container.unity.cpp b/src/beast/beast/container/Container.unity.cpp
index d631d45eae..e4dda6ebd6 100644
--- a/src/beast/beast/container/Container.unity.cpp
+++ b/src/beast/beast/container/Container.unity.cpp
@@ -21,10 +21,5 @@
#include
#endif
-#include
-#include
-
#include
#include
-#include
-#include
diff --git a/src/beast/beast/container/hardened_hash.h b/src/beast/beast/container/hardened_hash.h
deleted file mode 100644
index 612fb3c9f1..0000000000
--- a/src/beast/beast/container/hardened_hash.h
+++ /dev/null
@@ -1,167 +0,0 @@
-//------------------------------------------------------------------------------
-/*
- This file is part of Beast: https://github.com/vinniefalco/Beast
- Copyright 2013, Vinnie Falco
-
- 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
-#include //
-#include //
-#include
-#include
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-// 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;
-
-template
-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 dist;
-
- state_t() : gen(rng()) {}
- // state_t(state_t const&) = delete;
- // state_t& operator=(state_t const&) = delete;
- };
- static static_initializer state;
- std::lock_guard lock (state->mutex);
- return {state->dist(state->gen), state->dist(state->gen)};
-}
-
-template
-class basic_hardened_hash;
-
-/**
- * Seed functor once per process
-*/
-template
-class basic_hardened_hash
-{
- static
- seed_pair const&
- init_seed_pair()
- {
- static static_initializer const
- p(get_seed_pair<>());
- return *p;
- }
-
-public:
- using result_type = typename HashAlgorithm::result_type;
-
- template
- 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(h);
- }
-};
-
-/**
- * Seed functor once per construction
-*/
-template
-class basic_hardened_hash
-{
- seed_pair m_seeds;
-public:
- using result_type = typename HashAlgorithm::result_type;
-
- basic_hardened_hash()
- : m_seeds(get_seed_pair<>())
- {}
-
- template
- result_type
- operator()(T const& t) const noexcept
- {
- HashAlgorithm h(m_seeds.first, m_seeds.second);
- hash_append(h, t);
- return static_cast(h);
- }
-};
-
-//------------------------------------------------------------------------------
-
-/** A std compatible hash adapter that resists adversarial inputs.
- For this to work, T must implement in its own namespace:
-
- @code
-
- template
- 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));
- hash_append (h, static_cast(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
- using hardened_hash = basic_hardened_hash;
-#else
-template
- using hardened_hash = basic_hardened_hash;
-#endif
-
-} // beast
-
-#endif
diff --git a/src/beast/beast/container/tests/hardened_hash.test.cpp b/src/beast/beast/container/tests/hardened_hash.test.cpp
deleted file mode 100644
index a90aaa1eee..0000000000
--- a/src/beast/beast/container/tests/hardened_hash.test.cpp
+++ /dev/null
@@ -1,313 +0,0 @@
-//------------------------------------------------------------------------------
-/*
- This file is part of Beast: https://github.com/vinniefalco/Beast
- Copyright 2013, Vinnie Falco
-
- 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
-#endif
-
-#include
-#include
-
-#include
-#include
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-namespace beast {
-namespace detail {
-
-template
-class test_user_type_member
-{
-private:
- T t;
-
-public:
- explicit test_user_type_member (T const& t_ = T())
- : t (t_)
- {
- }
-
- template
- friend void hash_append (Hasher& h, test_user_type_member const& a) noexcept
- {
- using beast::hash_append;
- hash_append (h, a.t);
- }
-};
-
-template
-class test_user_type_free
-{
-private:
- T t;
-
-public:
- explicit test_user_type_free (T const& t_ = T())
- : t (t_)
- {
- }
-
- template
- 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
-using test_hardened_unordered_set =
- std::unordered_set >;
-
-template
-using test_hardened_unordered_map =
- std::unordered_map >;
-
-template
-using test_hardened_unordered_multiset =
- std::unordered_multiset >;
-
-template
-using test_hardened_unordered_multimap =
- std::unordered_multimap >;
-
-} // beast
-
-template
-class unsigned_integer
-{
-private:
- static_assert (std::is_integral::value &&
- std::is_unsigned ::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 m_vec;
-
-public:
- typedef UInt value_type;
-
- static std::size_t const bits = Bits;
- static std::size_t const bytes = bits / 8;
-
- template
- 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
- 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
- void
- check ()
- {
- T t{};
- hardened_hash <>() (t);
- pass();
- }
-
- template class U>
- void
- check_user_type()
- {
- check > ();
- check > ();
- check > ();
- check > ();
- // These cause trouble for boost
- //check > ();
- //check > ();
- check > ();
- check > ();
- check > ();
- check > ();
- check > ();
- check > ();
- check > ();
- check > ();
- check > ();
- check > ();
- check > ();
- check > ();
- }
-
- template class C >
- void
- check_container()
- {
- {
- C > c;
- }
-
- pass();
-
- {
- C > c;
- }
-
- pass();
- }
-
- void
- test_user_types()
- {
- testcase ("user types");
- check_user_type ();
- check_user_type ();
- }
-
- void
- test_containers()
- {
- testcase ("containers");
- check_container ();
- check_container ();
- check_container ();
- check_container ();
- }
-
- 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
diff --git a/src/beast/beast/hash/fnv1a.h b/src/beast/beast/hash/fnv1a.h
new file mode 100644
index 0000000000..a7cd30e3cf
--- /dev/null
+++ b/src/beast/beast/hash/fnv1a.h
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+/*
+ This file is part of Beast: https://github.com/vinniefalco/Beast
+ Copyright 2014, Howard Hinnant ,
+ Vinnie Falco
+#include
+#include
+#include //
+
+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 ::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(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(state_);
+ }
+};
+
+} // beast
+
+#endif
diff --git a/src/beast/beast/container/hash_append.h b/src/beast/beast/hash/hash_append.h
similarity index 88%
rename from src/beast/beast/container/hash_append.h
rename to src/beast/beast/hash/hash_append.h
index b8d195154a..fb9b32881e 100644
--- a/src/beast/beast/container/hash_append.h
+++ b/src/beast/beast/hash/hash_append.h
@@ -18,18 +18,14 @@
*/
//==============================================================================
-#ifndef BEAST_CONTAINER_HASH_APPEND_H_INCLUDED
-#define BEAST_CONTAINER_HASH_APPEND_H_INCLUDED
+#ifndef BEAST_HASH_HASH_APPEND_H_INCLUDED
+#define BEAST_HASH_HASH_APPEND_H_INCLUDED
#include
-
-#include
-
+#include
#if BEAST_USE_BOOST_FEATURES
#include
#endif
-
-#include
#include
#include
#include
@@ -656,96 +652,6 @@ hash_append (Hasher& h, T0 const& t0, T1 const& t1, T const& ...t) noexcept
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(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(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 (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
-struct uhash
-{
- using result_type = typename Hasher::result_type;
-
- template
- result_type
- operator()(T const& t) const noexcept
- {
- Hasher h;
- hash_append (h, t);
- return static_cast(h);
- }
-};
-
-
} // beast
#endif
diff --git a/src/beast/beast/hash/impl/hash_speed_test.cpp b/src/beast/beast/hash/impl/hash_speed_test.cpp
new file mode 100644
index 0000000000..acc3abae03
--- /dev/null
+++ b/src/beast/beast/hash/impl/hash_speed_test.cpp
@@ -0,0 +1,85 @@
+//------------------------------------------------------------------------------
+/*
+ This file is part of Beast: https://github.com/vinniefalco/Beast
+ Copyright 2013, Vinnie Falco
+
+ 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
+#endif
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace beast {
+
+class hash_speed_test : public beast::unit_test::suite
+{
+public:
+ using clock_type =
+ std::chrono::high_resolution_clock;
+ template
+ void
+ test (std::string const& what, std::size_t n)
+ {
+ using namespace std;
+ using namespace std::chrono;
+ xor_shift_engine g(1);
+ array 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(h);
+ (void)temp;
+ }
+ auto const elapsed = clock_type::now() - start;
+ log << setw(12) << what << " " <<
+ duration(elapsed) << "s";
+ }
+
+ void
+ run()
+ {
+ enum
+ {
+ N = 100000000
+ };
+
+ #if ! BEAST_NO_XXHASH
+ test ("xxhash", N);
+ #endif
+ test ("fnv1a", N);
+ test ("siphash", N);
+ pass();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE_MANUAL(hash_speed,container,beast);
+
+} // beast
diff --git a/src/beast/beast/container/impl/siphash.cpp b/src/beast/beast/hash/impl/siphash.cpp
similarity index 96%
rename from src/beast/beast/container/impl/siphash.cpp
rename to src/beast/beast/hash/impl/siphash.cpp
index ef5181b4d5..00782b86fd 100644
--- a/src/beast/beast/container/impl/siphash.cpp
+++ b/src/beast/beast/hash/impl/siphash.cpp
@@ -24,18 +24,15 @@
//
//------------------------------------------------------------------------------
-#include
+#include
#include
#include
#include
// namespace acme is used to demonstrate example code. It is not proposed.
-namespace beast
-{
-
-namespace
-{
+namespace beast {
+namespace detail {
typedef std::uint64_t u64;
typedef std::uint32_t u32;
@@ -82,7 +79,7 @@ sipround(u64& v0, u64& v1, u64& v2, u64& v3)
v2 = rotl(v2, 32);
}
-} // unnamed
+} // detail
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
siphash::append (void const* key, std::size_t inlen) noexcept
{
+ using namespace detail;
u8 const* in = static_cast(key);
total_length_ += inlen;
if (bufsize_ + inlen < 8)
@@ -130,6 +128,7 @@ siphash::append (void const* key, std::size_t inlen) noexcept
siphash::operator std::size_t() noexcept
{
+ using namespace detail;
std::size_t b = static_cast(total_length_) << 56;
switch(bufsize_)
{
@@ -163,4 +162,4 @@ siphash::operator std::size_t() noexcept
return b;
}
-} // beast
+} // beast
diff --git a/src/beast/beast/container/impl/spookyv2.cpp b/src/beast/beast/hash/impl/spookyv2.cpp
similarity index 99%
rename from src/beast/beast/container/impl/spookyv2.cpp
rename to src/beast/beast/hash/impl/spookyv2.cpp
index 8195eb6cc1..8aeeaa15ce 100644
--- a/src/beast/beast/container/impl/spookyv2.cpp
+++ b/src/beast/beast/hash/impl/spookyv2.cpp
@@ -10,7 +10,7 @@
// August 5 2012: SpookyV2: d = should be d += in short hash, and remove extra mix from long hash
#include
-#include
+#include
#ifdef _MSC_VER
#pragma warning (push)
diff --git a/src/beast/beast/container/impl/spookyv2.h b/src/beast/beast/hash/impl/spookyv2.h
similarity index 100%
rename from src/beast/beast/container/impl/spookyv2.h
rename to src/beast/beast/hash/impl/spookyv2.h
diff --git a/src/beast/beast/hash/impl/xxhash.c b/src/beast/beast/hash/impl/xxhash.c
new file mode 100644
index 0000000000..7d5f6f2244
--- /dev/null
+++ b/src/beast/beast/hash/impl/xxhash.c
@@ -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
+
+//**************************************
+// 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
+static void* XXH_malloc(size_t s) { return malloc(s); }
+static void XXH_free (void* p) { free(p); }
+// for memcpy()
+#include
+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
+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> 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> 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> 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> 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
diff --git a/src/beast/beast/hash/impl/xxhash.h b/src/beast/beast/hash/impl/xxhash.h
new file mode 100644
index 0000000000..f8a2fa5dba
--- /dev/null
+++ b/src/beast/beast/hash/impl/xxhash.h
@@ -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 /* 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
diff --git a/src/beast/beast/hash/siphash.h b/src/beast/beast/hash/siphash.h
new file mode 100644
index 0000000000..dc25a4e79f
--- /dev/null
+++ b/src/beast/beast/hash/siphash.h
@@ -0,0 +1,59 @@
+//------------------------------------------------------------------------------
+/*
+ This file is part of Beast: https://github.com/vinniefalco/Beast
+ Copyright 2014, Howard Hinnant ,
+ Vinnie Falco
+#include
+#include
+
+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
diff --git a/src/beast/beast/hash/spooky.h b/src/beast/beast/hash/spooky.h
new file mode 100644
index 0000000000..84270d022f
--- /dev/null
+++ b/src/beast/beast/hash/spooky.h
@@ -0,0 +1,59 @@
+//------------------------------------------------------------------------------
+/*
+ This file is part of Beast: https://github.com/vinniefalco/Beast
+ Copyright 2014, Howard Hinnant ,
+ Vinnie Falco
+
+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 (h1);
+ }
+};
+
+} // beast
+
+#endif
diff --git a/src/beast/beast/container/tests/hash_append.test.cpp b/src/beast/beast/hash/tests/hash_append_test.cpp
similarity index 97%
rename from src/beast/beast/container/tests/hash_append.test.cpp
rename to src/beast/beast/hash/tests/hash_append_test.cpp
index dacff5aa2f..1dc6e64923 100644
--- a/src/beast/beast/container/tests/hash_append.test.cpp
+++ b/src/beast/beast/hash/tests/hash_append_test.cpp
@@ -17,21 +17,15 @@
*/
//==============================================================================
-// MODULES: ../impl/spookyv2.cpp
-
#if BEAST_INCLUDE_BEASTCONFIG
#include
#endif
-#include
-
-#include
-#include
-
+#include
+#include
#include
#include
#include
-
#include
#include
#include
@@ -40,8 +34,6 @@
namespace beast {
-//------------------------------------------------------------------------------
-
template
class block_stream
{
diff --git a/src/beast/beast/container/tests/hash_metrics.h b/src/beast/beast/hash/tests/hash_metrics.h
similarity index 100%
rename from src/beast/beast/container/tests/hash_metrics.h
rename to src/beast/beast/hash/tests/hash_metrics.h
diff --git a/src/beast/beast/hash/tests/hash_speed_test.cpp b/src/beast/beast/hash/tests/hash_speed_test.cpp
new file mode 100644
index 0000000000..42367f2924
--- /dev/null
+++ b/src/beast/beast/hash/tests/hash_speed_test.cpp
@@ -0,0 +1,86 @@
+//------------------------------------------------------------------------------
+/*
+ This file is part of Beast: https://github.com/vinniefalco/Beast
+ Copyright 2013, Vinnie Falco
+
+ 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
+#endif
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace beast {
+
+class hash_speed_test : public beast::unit_test::suite
+{
+public:
+ using clock_type =
+ std::chrono::high_resolution_clock;
+ template
+ void
+ test (std::string const& what, std::size_t n)
+ {
+ using namespace std;
+ using namespace std::chrono;
+ xor_shift_engine g(1);
+ array 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(h);
+ (void)temp;
+ }
+ auto const elapsed = clock_type::now() - start;
+ log << setw(12) << what << " " <<
+ duration(elapsed) << "s";
+ }
+
+ void
+ run()
+ {
+ enum
+ {
+ N = 100000000
+ };
+
+ #if ! BEAST_NO_XXHASH
+ test ("xxhash", N);
+ #endif
+ test ("fnv1a", N);
+ test ("siphash", N);
+ pass();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE_MANUAL(hash_speed,container,beast);
+
+} // beast
diff --git a/src/beast/beast/hash/uhash.h b/src/beast/beast/hash/uhash.h
new file mode 100644
index 0000000000..380ff33c76
--- /dev/null
+++ b/src/beast/beast/hash/uhash.h
@@ -0,0 +1,46 @@
+//------------------------------------------------------------------------------
+/*
+ This file is part of Beast: https://github.com/vinniefalco/Beast
+ Copyright 2014, Howard Hinnant ,
+ Vinnie Falco
+
+namespace beast {
+
+// Universal hash function
+template
+struct uhash
+{
+ using result_type = typename Hasher::result_type;
+
+ template
+ result_type
+ operator()(T const& t) const noexcept
+ {
+ Hasher h;
+ hash_append (h, t);
+ return static_cast(h);
+ }
+};
+
+} // beast
+
+#endif
diff --git a/src/beast/beast/hash/xxhasher.h b/src/beast/beast/hash/xxhasher.h
new file mode 100644
index 0000000000..e3c5c944d3
--- /dev/null
+++ b/src/beast/beast/hash/xxhasher.h
@@ -0,0 +1,86 @@
+//------------------------------------------------------------------------------
+/*
+ This file is part of Beast: https://github.com/vinniefalco/Beast
+ Copyright 2014, Vinnie Falco
+
+ 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
+#include
+#include //
+#include
+
+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 ::value>* = nullptr>
+ explicit
+ xxhasher (Seed seed)
+ {
+ detail::XXH64_reset (&state_, seed);
+ }
+
+ template ::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
diff --git a/src/beast/beast/insight/impl/Groups.cpp b/src/beast/beast/insight/impl/Groups.cpp
index 430052d953..f8f3f3e6b9 100644
--- a/src/beast/beast/insight/impl/Groups.cpp
+++ b/src/beast/beast/insight/impl/Groups.cpp
@@ -18,8 +18,8 @@
//==============================================================================
#include
-
-#include
+#include
+#include //
namespace beast {
namespace insight {
diff --git a/src/beast/beast/net/IPAddress.h b/src/beast/beast/net/IPAddress.h
index a9805c9bfc..a4ff62bc70 100644
--- a/src/beast/beast/net/IPAddress.h
+++ b/src/beast/beast/net/IPAddress.h
@@ -22,8 +22,8 @@
#include
#include
-#include
-
+#include
+#include
#include
#include
diff --git a/src/beast/beast/net/IPAddressV4.h b/src/beast/beast/net/IPAddressV4.h
index 6f9f380495..9080d5f4b7 100644
--- a/src/beast/beast/net/IPAddressV4.h
+++ b/src/beast/beast/net/IPAddressV4.h
@@ -20,7 +20,7 @@
#ifndef BEAST_NET_IPADDRESSV4_H_INCLUDED
#define BEAST_NET_IPADDRESSV4_H_INCLUDED
-#include
+#include
#include
#include
diff --git a/src/beast/beast/net/IPEndpoint.h b/src/beast/beast/net/IPEndpoint.h
index 3d4cc731b4..4cdbbdab20 100644
--- a/src/beast/beast/net/IPEndpoint.h
+++ b/src/beast/beast/net/IPEndpoint.h
@@ -21,8 +21,8 @@
#define BEAST_NET_IPENDPOINT_H_INCLUDED
#include
-#include
-
+#include
+#include
#include
#include
#include
diff --git a/src/beast/beast/unity/hash_unity.cpp b/src/beast/beast/unity/hash_unity.cpp
new file mode 100644
index 0000000000..f1b89f4f7c
--- /dev/null
+++ b/src/beast/beast/unity/hash_unity.cpp
@@ -0,0 +1,29 @@
+//------------------------------------------------------------------------------
+/*
+ This file is part of Beast: https://github.com/vinniefalco/Beast
+ Copyright 2013, Vinnie Falco
+
+ 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
+#include
+
+#if ! BEAST_NO_XXHASH
+#include
+#endif
+#include
+
+#include
+#include
diff --git a/src/beast/beast/utility/tagged_integer.h b/src/beast/beast/utility/tagged_integer.h
index 39a43def64..3f9545c54c 100644
--- a/src/beast/beast/utility/tagged_integer.h
+++ b/src/beast/beast/utility/tagged_integer.h
@@ -20,7 +20,7 @@
#ifndef BEAST_UTILITY_TAGGED_INTEGER_H_INCLUDED
#define BEAST_UTILITY_TAGGED_INTEGER_H_INCLUDED
-#include
+#include