summaryrefslogtreecommitdiffstats
path: root/base/hash.cc
diff options
context:
space:
mode:
authorjbates@chromium.org <jbates@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-01 00:55:09 +0000
committerjbates@chromium.org <jbates@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-01 00:55:09 +0000
commit51ddf72550374b626eb2ea3239ca13f04c8eb2b7 (patch)
treed9f20bad2e99049d57c3d9350cd5a6ce72952cff /base/hash.cc
parent5731e121244fb91b97b37daefc1b59b27387b050 (diff)
downloadchromium_src-51ddf72550374b626eb2ea3239ca13f04c8eb2b7.zip
chromium_src-51ddf72550374b626eb2ea3239ca13f04c8eb2b7.tar.gz
chromium_src-51ddf72550374b626eb2ea3239ca13f04c8eb2b7.tar.bz2
Move hash.h/cc from net to base.
Review URL: https://chromiumcodereview.appspot.com/10920026 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@154554 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/hash.cc')
-rw-r--r--base/hash.cc73
1 files changed, 73 insertions, 0 deletions
diff --git a/base/hash.cc b/base/hash.cc
new file mode 100644
index 0000000..2c87065
--- /dev/null
+++ b/base/hash.cc
@@ -0,0 +1,73 @@
+// From http://www.azillionmonkeys.com/qed/hash.html
+
+#include "base/hash.h"
+
+typedef uint32 uint32_t;
+typedef uint16 uint16_t;
+
+namespace base {
+
+#undef get16bits
+#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \
+ || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)
+#define get16bits(d) (*((const uint16_t *) (d)))
+#endif
+
+#if !defined (get16bits)
+#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
+ +(uint32_t)(((const uint8_t *)(d))[0]) )
+#endif
+
+uint32 SuperFastHash(const char * data, int len) {
+ uint32_t hash = len, tmp;
+ int rem;
+
+ if (len <= 0 || data == NULL)
+ return 0;
+
+ rem = len & 3;
+ len >>= 2;
+
+ /* Main loop */
+ for (; len > 0; len--) {
+ hash += get16bits(data);
+ tmp = (get16bits(data + 2) << 11) ^ hash;
+ hash = (hash << 16) ^ tmp;
+ data += 2 * sizeof(uint16_t);
+ hash += hash >> 11;
+ }
+
+ /* Handle end cases */
+ switch (rem) {
+ case 3:
+ hash += get16bits(data);
+ hash ^= hash << 16;
+
+ // Treat the final character as signed. This ensures all platforms behave
+ // consistently with the original x86 code.
+ hash ^= static_cast<signed char>(data[sizeof(uint16_t)]) << 18;
+ hash += hash >> 11;
+ break;
+ case 2:
+ hash += get16bits(data);
+ hash ^= hash << 11;
+ hash += hash >> 17;
+ break;
+ case 1:
+ hash += static_cast<signed char>(*data);
+ hash ^= hash << 10;
+ hash += hash >> 1;
+ }
+
+ /* Force "avalanching" of final 127 bits */
+ hash ^= hash << 3;
+ hash += hash >> 5;
+ hash ^= hash << 4;
+ hash += hash >> 17;
+ hash ^= hash << 25;
+ hash += hash >> 6;
+
+ return hash;
+}
+
+} // namespace base