From 102727aa3ac8e21bccae013aa445d06bbeef1aa0 Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Mon, 2 May 2016 12:36:21 +0100 Subject: [PATCH] Add missing doc file. --- doc/html/boost_multiprecision/tut/hash.html | 83 +++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 doc/html/boost_multiprecision/tut/hash.html diff --git a/doc/html/boost_multiprecision/tut/hash.html b/doc/html/boost_multiprecision/tut/hash.html new file mode 100644 index 00000000..a01e594c --- /dev/null +++ b/doc/html/boost_multiprecision/tut/hash.html @@ -0,0 +1,83 @@ + + + +Hash Function Support + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +

+ All of the types in this library support hashing via boost::hash or std::hash. + That means we can use multiprecision types directly in hashed containers + such as std::unordered_set: +

+
using namespace boost::multiprecision;
+using namespace boost::random;
+
+mt19937 mt;
+uniform_int_distribution<uint256_t> ui;
+
+std::unordered_set<uint256_t> set;
+// Put 1000 random values into the container:
+for(unsigned i = 0; i < 1000; ++i)
+   set.insert(ui(mt));
+
+

+ Or we can define our own hash function, for example in this case based on + Google's CityHash: +

+
struct cityhash
+{
+   std::size_t operator()(const boost::multiprecision::uint256_t& val)const
+   {
+      // create a hash from all the limbs of the argument, this function is probably x64 specific,
+      // and requires that we access the internals of the data type:
+      std::size_t result = CityHash64(reinterpret_cast<const char*>(val.backend().limbs()), val.backend().size() * sizeof(val.backend().limbs()[0]));
+      // modify the returned hash based on sign:
+      return val < 0 ? ~result : result;
+   }
+};
+
+

+ As before insert some values into a container, this time using our custom + hasher: +

+
std::unordered_set<uint256_t, cityhash> set2;
+for(unsigned i = 0; i < 1000; ++i)
+   set2.insert(ui(mt));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ +