Paul J. Lucas has proposed merging lp:~paul-lucas/zorba/pjl-misc into lp:zorba.

Commit message:
Added hash_c_str() and hash<char const*>.

Requested reviews:
  Paul J. Lucas (paul-lucas)

For more details, see:
https://code.launchpad.net/~paul-lucas/zorba/pjl-misc/+merge/159290

Added hash_c_str() and hash<char const*>.
-- 
https://code.launchpad.net/~paul-lucas/zorba/pjl-misc/+merge/159290
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'src/util/hash/hash.cpp'
--- src/util/hash/hash.cpp	2013-02-07 17:24:36 +0000
+++ src/util/hash/hash.cpp	2013-04-17 04:58:28 +0000
@@ -31,15 +31,15 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 size_t hash_bytes( void const *p, size_t len, size_t result ) {
-  unsigned char const *c = reinterpret_cast<unsigned char const*>( p );
-  unsigned char const *const end = c + len;
+  unsigned char const *u = reinterpret_cast<unsigned char const*>( p );
+  unsigned char const *const end = u + len;
 #ifdef ZORBA_HASH_FN_FNV_1a
   //
   // FNV-1a (Fowler/Noll/Vo) hashing algorithm.
   //
-  while ( c < end ) {
+  while ( u < end ) {
     result *= Hash_Prime;
-    result ^= *c++;
+    result ^= *u++;
   }
 #endif /* ZORBA_HASH_FN_FNV_1a */
 #ifdef ZORBA_HASH_FN_PJW
@@ -61,8 +61,32 @@
   static size_t const OneEighth     = BitsInSizeT / 8;
   static size_t const HighBits      = ~( (size_t)(~0ul) >> OneEighth );
 
-  while ( c < end ) {
-    result = (result << OneEighth) + *c++;
+  while ( u < end ) {
+    result = (result << OneEighth) + *u++;
+    if ( size_t temp = result & HighBits )
+      result = (result ^ (temp >> ThreeFourths)) & ~HighBits;
+  }
+#endif /* ZORBA_HASH_FN_PJW */
+  return result;
+}
+
+size_t hash_c_str( char const *s, size_t result ) {
+  unsigned char const *u = reinterpret_cast<unsigned char const*>( s );
+#ifdef ZORBA_HASH_FN_FNV_1a
+  while ( *u ) {
+    result *= Hash_Prime;
+    result ^= *u++;
+  }
+#endif /* ZORBA_HASH_FN_FNV_1a */
+#ifdef ZORBA_HASH_FN_PJW
+  static size_t const BitsInSizeT   = sizeof( size_t ) *
+                                      numeric_limits<unsigned char>::digits;
+  static size_t const ThreeFourths  = BitsInSizeT * 3 / 4;
+  static size_t const OneEighth     = BitsInSizeT / 8;
+  static size_t const HighBits      = ~( (size_t)(~0ul) >> OneEighth );
+
+  while ( *u ) {
+    result = (result << OneEighth) + *u++;
     if ( size_t temp = result & HighBits )
       result = (result ^ (temp >> ThreeFourths)) & ~HighBits;
   }

=== modified file 'src/util/hash/hash.h'
--- src/util/hash/hash.h	2013-02-07 17:24:36 +0000
+++ src/util/hash/hash.h	2013-04-17 04:58:28 +0000
@@ -79,6 +79,31 @@
   return hash_bytes( &v, sizeof( v ) );
 }
 
+/**
+ * Generic hash function that hashes a null-terminated C string.
+ *
+ * @param s A pointer to the C string to hash.
+ * @param init The initialization value.
+ * @return Returns the hash code for the given C string.
+ */
+size_t hash_c_str( char const *s, size_t init = Hash_Init );
+
+/**
+ * The generic %hash unary_function class.
+ *
+ * @tparam T The type to hash.
+ */
+template<typename T>
+struct hash : std::unary_function<T,size_t> {
+  size_t operator()( T ) const; // not defined
+};
+
+/** Specialization for \c char*. */
+template<> inline
+size_t hash<char const*>::operator()( char const *s ) const {
+  return hash_c_str( s );
+}
+
 } // namespace ztd
 } // namespace zorba
 

-- 
Mailing list: https://launchpad.net/~zorba-coders
Post to     : zorba-coders@lists.launchpad.net
Unsubscribe : https://launchpad.net/~zorba-coders
More help   : https://help.launchpad.net/ListHelp

Reply via email to