Hi,
   the attached patch makes it possible to have a default hasher
implementation for SBuf, thus enabling baseline std::unordered_map<SBuf,*>
support.
Different, more specialized, hash functions can be of course implemented
via template arguments to std::unordered_map of course.
The implementation is a reworked hash_string, so it shouldn't be any less
effective than that for our workloads.



-- 
    Francesco
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: [email protected]
# target_branch: file:///home/kinkie/squid/workspace/trunk/
# testament_sha1: 51a37a68f63086216de26c8c7c17da6813b8e3c9
# timestamp: 2015-07-27 19:41:34 +0200
# base_revision_id: [email protected]\
#   laysak37yrb6qzdu
# 
# Begin patch
=== modified file 'src/SBuf.cc'
--- src/SBuf.cc	2015-07-26 18:16:34 +0000
+++ src/SBuf.cc	2015-07-27 17:41:03 +0000
@@ -17,6 +17,7 @@
 #include "util.h"
 
 #include <cstring>
+#include <functional>
 #include <iostream>
 #include <sstream>
 
@@ -952,3 +953,16 @@
     reAlloc(newsize);
 }
 
+std::size_t std::hash<SBuf>::operator() (const SBuf & sbuf) const noexcept
+{
+    //ripped and adapted from hash_string
+    const char *s = sbuf.rawContent();
+    size_t rv = 0;
+    SBuf::size_type len=sbuf.length();
+    while (len != 0) {
+        rv ^= 271 * *s;
+        ++s;
+        --len;
+    }
+    return rv ^ (sbuf.length() * 271);
+}

=== modified file 'src/SBuf.h'
--- src/SBuf.h	2015-03-14 04:42:10 +0000
+++ src/SBuf.h	2015-07-27 17:41:03 +0000
@@ -722,6 +722,15 @@
     return buf;
 }
 
+namespace std {
+    /// default hash functor to support std::unordered_map<SBuf,*>
+    template <>
+    struct hash<SBuf>
+    {
+        size_t operator()(const SBuf &) const noexcept;
+    };
+}
+
 inline
 SBufIterator::SBufIterator(const SBuf &s, size_type pos)
     : iter(s.rawContent()+pos)
@@ -742,4 +751,3 @@
 }
 
 #endif /* SQUID_SBUF_H */
-

=== modified file 'src/tests/testSBuf.cc'
--- src/tests/testSBuf.cc	2015-02-02 18:12:05 +0000
+++ src/tests/testSBuf.cc	2015-07-27 17:41:03 +0000
@@ -17,6 +17,7 @@
 
 #include <iostream>
 #include <stdexcept>
+#include <unordered_map>
 
 CPPUNIT_TEST_SUITE_REGISTRATION( testSBuf );
 
@@ -952,3 +953,31 @@
     }
 }
 
+void
+testSBuf::testSBufHash()
+{
+    // same SBuf must have same hash
+    auto hasher=std::hash<SBuf>();
+    CPPUNIT_ASSERT_EQUAL(hasher(literal),hasher(literal));
+
+    // same content must have same hash
+    CPPUNIT_ASSERT_EQUAL(hasher(literal),hasher(SBuf(fox)));
+    CPPUNIT_ASSERT_EQUAL(hasher(SBuf(fox)),hasher(SBuf(fox)));
+
+    //differen content should have different hash
+    CPPUNIT_ASSERT(hasher(SBuf(fox)) != hasher(SBuf(fox1)));
+
+    {
+        std::unordered_map<SBuf, int> um;
+        um[SBuf("one")] = 1;
+        um[SBuf("two")] = 2;
+
+        auto i = um.find(SBuf("one"));
+        CPPUNIT_ASSERT(i != um.end());
+        CPPUNIT_ASSERT(i->second == 1);
+
+        i = um.find(SBuf("eleventy"));
+        CPPUNIT_ASSERT(i == um.end());
+
+    }
+}

=== modified file 'src/tests/testSBuf.h'
--- src/tests/testSBuf.h	2015-01-31 19:41:00 +0000
+++ src/tests/testSBuf.h	2015-07-27 17:41:03 +0000
@@ -53,6 +53,7 @@
     CPPUNIT_TEST( testAutoFind );
     CPPUNIT_TEST( testStdStringOps );
     CPPUNIT_TEST( testIterators );
+    CPPUNIT_TEST( testSBufHash );
 //    CPPUNIT_TEST( testDumpStats ); //fake test, to print alloc stats
     CPPUNIT_TEST_SUITE_END();
 protected:
@@ -93,6 +94,7 @@
     void testAutoFind();
     void testStdStringOps();
     void testIterators();
+    void testSBufHash();
 };
 
 #endif

# Begin bundle
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
WuluuQhZ2ObTEcZJh/Yu5IpwoSGNjf/2
_______________________________________________
squid-dev mailing list
[email protected]
http://lists.squid-cache.org/listinfo/squid-dev

Reply via email to