Compute jenkins hash byte by byte on big endian platforms
authorTrond Norbye <trond.norbye@sun.com>
Thu, 19 Mar 2009 16:59:27 +0000 (17:59 +0100)
committerTrond Norbye <trond.norbye@sun.com>
Thu, 19 Mar 2009 16:59:27 +0000 (17:59 +0100)
config/byteorder.m4
libmemcached/jenkins_hash.c

index 0d8cc8f8920918b0024385ddcd9dd1e5800acbe6..b6bd84a8f18b5c00912d18765a6e3d3b66cf1b93 100644 (file)
@@ -17,25 +17,25 @@ AC_DEFUN([DETECT_BYTEORDER],
 
     AC_MSG_RESULT([$have_htoll])
     AM_CONDITIONAL([BUILD_BYTEORDER],[test "x$have_htoll" == "xno"])
-    if test "x$have_htoll" == "xno"
-    then
-       AC_MSG_CHECKING([byteorder])
-       have_htoll="no"
-       AC_RUN_IFELSE([
-          AC_LANG_PROGRAM([
+    AC_MSG_CHECKING([byteorder])
+    have_htoll="no"
+    AC_RUN_IFELSE([
+       AC_LANG_PROGRAM([
 #include <sys/types.h>
 #include <netinet/in.h>
 #include <inttypes.h>
-          ], [
+       ], [
 if (htonl(5) != 5) {
    return 1;
 }
-          ])            
-       ], [
-          AC_MSG_RESULT([big endian])
-          AC_DEFINE([BYTEORDER_BIG_ENDIAN], [1], [Enable big endian byteorder])
-       ], AC_MSG_RESULT([little endian]))
-    fi
+       ])            
+    ], [
+       AC_MSG_RESULT([big endian])
+       AC_DEFINE([BYTEORDER_BIG_ENDIAN], [1], [Enable big endian byteorder])
+    ], [
+       AC_MSG_RESULT([little endian])
+       AC_DEFINE([BYTEORDER_LITTLE_ENDIAN], [1], [Enable little endian byteorder])
+    ])
 ])
 
 DETECT_BYTEORDER
index 409a405400e46e875a4d3ef4e3cb893a57f7fad8..262ff937bbcf300e59fbf346a9c1329f7c32df0c 100644 (file)
@@ -63,6 +63,7 @@ uint32_t jenkins_hash(const void *key, size_t length, uint32_t initval)
   a = b = c = 0xdeadbeef + ((uint32_t)length) + initval;
 
   u.ptr = key;
+#ifdef BYTEORDER_LITTLE_ENDIAN
   if ((u.i & 0x3) == 0)
   {
     const uint32_t *k = (const uint32_t *)key;         /* read 32-bit chunks */
@@ -157,6 +158,7 @@ uint32_t jenkins_hash(const void *key, size_t length, uint32_t initval)
   } 
   else
   {                        /* need to read the key one byte at a time */
+#endif /* little endian */
     const uint8_t *k = (const uint8_t *)key;
 
     /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
@@ -197,7 +199,9 @@ uint32_t jenkins_hash(const void *key, size_t length, uint32_t initval)
              break;
     case 0 : return c;
     }
+#ifdef BYTEORDER_LITTLE_ENDIAN
   }
+#endif
 
   final(a,b,c);
   return c;