PR 59406 note that FNV hash functions are incorrect
authorJonathan Wakely <jwakely@redhat.com>
Tue, 15 Nov 2016 20:17:39 +0000 (20:17 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 15 Nov 2016 20:17:39 +0000 (20:17 +0000)
PR libstdc++/59406
* include/bits/functional_hash.h: Add comment noting difference from
FNV-1a.
* include/tr1/functional_hash.h: Likewise.
* libsupc++/hash_bytes.cc: Likewise.

From-SVN: r242454

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/functional_hash.h
libstdc++-v3/include/tr1/functional_hash.h
libstdc++-v3/libsupc++/hash_bytes.cc

index 4bba6a4e105e00e5271911a05e3ca2534c3718c8..d82aaa4aff5a3fe609eeb2df6a3a60d04d72f8ee 100644 (file)
@@ -1,5 +1,11 @@
 2016-11-15  Jonathan Wakely  <jwakely@redhat.com>
 
+       PR libstdc++/59406
+       * include/bits/functional_hash.h: Add comment noting difference from
+       FNV-1a.
+       * include/tr1/functional_hash.h: Likewise.
+       * libsupc++/hash_bytes.cc: Likewise.
+
        * include/bits/basic_string.h: Reuse _If_sv alias template for new
        constructor.
 
index dc096831869213e556a7dcfeed3b320525674979..cee1ea890eb4bd679a6002ca1fdb70db85b7bb5e 100644 (file)
@@ -200,6 +200,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       { return hash(&__val, sizeof(__val), __hash); }
   };
 
+  // A hash function similar to FNV-1a (see PR59406 for how it differs).
   struct _Fnv_hash_impl
   {
     static size_t
index 4edc49ad86829552dfba5652bf6e40bcc5140adf..8148e4d7175c9926e7d43654a77904150943f223 100644 (file)
@@ -83,6 +83,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   // Fowler / Noll / Vo (FNV) Hash (type FNV-1a)
   // (Used by the next specializations of std::tr1::hash.)
 
+  // N.B. These functions should work on unsigned char, otherwise they do not
+  // correctly implement the FNV-1a algorithm (see PR59406).
+  // The existing behaviour is retained for backwards compatibility.
+
   /// Dummy generic implementation (for sizeof(size_t) != 4, 8).
   template<size_t>
     struct _Fnv_hash_base
index 1042de66388a46cf85bc5f8ec736ad175542d0a3..7d76c34edb40c72022abed359cd3a52456c3aa8b 100644 (file)
@@ -112,6 +112,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   }
 
   // Implementation of FNV hash for 32-bit size_t.
+  // N.B. This function should work on unsigned char, otherwise it does not
+  // correctly implement the FNV-1a algorithm (see PR59406).
+  // The existing behaviour is retained for backwards compatibility.
   size_t
   _Fnv_hash_bytes(const void* ptr, size_t len, size_t hash)
   {
@@ -157,6 +160,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   }
 
   // Implementation of FNV hash for 64-bit size_t.
+  // N.B. This function should work on unsigned char, otherwise it does not
+  // correctly implement the FNV-1a algorithm (see PR59406).
+  // The existing behaviour is retained for backwards compatibility.
   size_t
   _Fnv_hash_bytes(const void* ptr, size_t len, size_t hash)
   {