diff mbox

PR 59406 note that FNV hash functions are incorrect

Message ID 20161115201733.GA11085@redhat.com
State New
Headers show

Commit Message

Jonathan Wakely Nov. 15, 2016, 8:17 p.m. UTC
The PR points out that our FNV hash functions don't correctly
implement the FNV-1a function. Since the code is only kept for
backwards compatibility we probably don't want to change the results,
so this just adds comments to point out the issue.

	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.

Tested powerpc64le-linux, committed to trunk.
commit 138a2ac8bc4bcbef28815ef89758f13e93fa433b
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Tue Nov 15 20:00:54 2016 +0000

    PR 59406 note that FNV hash functions are incorrect
    
    	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.
diff mbox

Patch

diff --git a/libstdc++-v3/include/bits/functional_hash.h b/libstdc++-v3/include/bits/functional_hash.h
index dc09683..cee1ea8 100644
--- a/libstdc++-v3/include/bits/functional_hash.h
+++ b/libstdc++-v3/include/bits/functional_hash.h
@@ -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
diff --git a/libstdc++-v3/include/tr1/functional_hash.h b/libstdc++-v3/include/tr1/functional_hash.h
index 4edc49a..8148e4d 100644
--- a/libstdc++-v3/include/tr1/functional_hash.h
+++ b/libstdc++-v3/include/tr1/functional_hash.h
@@ -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
diff --git a/libstdc++-v3/libsupc++/hash_bytes.cc b/libstdc++-v3/libsupc++/hash_bytes.cc
index 1042de6..7d76c34 100644
--- a/libstdc++-v3/libsupc++/hash_bytes.cc
+++ b/libstdc++-v3/libsupc++/hash_bytes.cc
@@ -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)
   {