[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 17/19: Merge commit '01a301d1b606b84d986b735049e7155d2f4
From: |
Andy Wingo |
Subject: |
[Guile-commits] 17/19: Merge commit '01a301d1b606b84d986b735049e7155d2f4cd6aa' |
Date: |
Thu, 22 Jan 2015 13:54:50 +0000 |
wingo pushed a commit to branch master
in repository guile.
commit e19235e21bad6fdf8c8152dc5b460685b551f330
Merge: baf9010 01a301d
Author: Andy Wingo <address@hidden>
Date: Thu Jan 22 14:49:36 2015 +0100
Merge commit '01a301d1b606b84d986b735049e7155d2f4cd6aa'
Conflicts:
libguile/hash.c
benchmark-suite/Makefile.am | 1 +
benchmark-suite/benchmarks/hash.bm | 53 ++++++++++++++++++++++++++++++++++++
libguile/hash.c | 2 +-
3 files changed, 55 insertions(+), 1 deletions(-)
diff --cc libguile/hash.c
index b0bf046,d51c661..d6ddb6b
--- a/libguile/hash.c
+++ b/libguile/hash.c
@@@ -45,88 -45,25 +45,88 @@@
extern double floor();
#endif
-#define SCM_MIN(A, B) ((A) < (B) ? (A) : (B))
-#if SCM_ENABLE_DEPRECATED == 1
+/* This hash function is originally from
+ http://burtleburtle.net/bob/c/lookup3.c by Bob Jenkins, May 2006,
+ Public Domain. No warranty. */
+
+#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
+#define mix(a,b,c) \
+{ \
+ a -= c; a ^= rot(c, 4); c += b; \
+ b -= a; b ^= rot(a, 6); a += c; \
+ c -= b; c ^= rot(b, 8); b += a; \
+ a -= c; a ^= rot(c,16); c += b; \
+ b -= a; b ^= rot(a,19); a += c; \
+ c -= b; c ^= rot(b, 4); b += a; \
+}
-unsigned long
-scm_string_hash (const unsigned char *str, size_t len)
-{
- /* from suggestion at: */
- /* http://srfi.schemers.org/srfi-13/mail-archive/msg00112.html */
+#define final(a,b,c) \
+{ \
+ c ^= b; c -= rot(b,14); \
+ a ^= c; a -= rot(c,11); \
+ b ^= a; b -= rot(a,25); \
+ c ^= b; c -= rot(b,16); \
+ a ^= c; a -= rot(c,4); \
+ b ^= a; b -= rot(a,14); \
+ c ^= b; c -= rot(b,24); \
+}
- unsigned long h = 0;
- while (len-- > 0)
- h = *str++ + h*37;
- return h;
+#define JENKINS_LOOKUP3_HASHWORD2(k, length, ret) \
+ do { \
+ scm_t_uint32 a, b, c; \
+ \
+ /* Set up the internal state. */ \
+ a = b = c = 0xdeadbeef + ((scm_t_uint32)(length<<2)) + 47; \
+ \
+ /* Handle most of the key. */ \
+ while (length > 3) \
+ { \
+ a += k[0]; \
+ b += k[1]; \
+ c += k[2]; \
+ mix (a, b, c); \
+ length -= 3; \
+ k += 3; \
+ } \
+ \
+ /* Handle the last 3 elements. */ \
+ switch(length) /* All the case statements fall through. */ \
+ { \
+ case 3 : c += k[2]; \
+ case 2 : b += k[1]; \
+ case 1 : a += k[0]; \
+ final (a, b, c); \
+ case 0: /* case 0: nothing left to add */ \
+ break; \
+ } \
+ \
+ if (sizeof (ret) == 8) \
+ ret = (((unsigned long) c) << 32) | b; \
+ else \
+ ret = c; \
+ } while (0)
+
+
+static unsigned long
+narrow_string_hash (const scm_t_uint8 *str, size_t len)
+{
+ unsigned long ret;
+ JENKINS_LOOKUP3_HASHWORD2 (str, len, ret);
+ ret >>= 2; /* Ensure that it fits in a fixnum. */
+ return ret;
}
-#endif
+static unsigned long
+wide_string_hash (const scm_t_wchar *str, size_t len)
+{
+ unsigned long ret;
+ JENKINS_LOOKUP3_HASHWORD2 (str, len, ret);
+ ret >>= 2; /* Ensure that it fits in a fixnum. */
+ return ret;
+}
- unsigned long
+ unsigned long
scm_i_string_hash (SCM str)
{
size_t len = scm_i_string_length (str);
- [Guile-commits] 04/19: Keywords have a tc7, (continued)
- [Guile-commits] 04/19: Keywords have a tc7, Andy Wingo, 2015/01/22
- [Guile-commits] 09/19: Merge commit '5fac1a7ada362d78f13143acbc0ceca7f2f101de', Andy Wingo, 2015/01/22
- [Guile-commits] 08/19: Merge commit '8cf2a7ba7432d68b9a055d29f18117be70375af9', Andy Wingo, 2015/01/22
- [Guile-commits] 10/19: Merge commit '7c433cbbce83bc9f2f9967afba00bbb68e312657', Andy Wingo, 2015/01/22
- [Guile-commits] 11/19: Merge commit '47ca15c7dffd14a82e75c1a0aeeaf2e77f3fa5b4', Andy Wingo, 2015/01/22
- [Guile-commits] 13/19: Merge commit 'cdcba5b2f6270de808e51b3b933374170611b91d', Andy Wingo, 2015/01/22
- [Guile-commits] 14/19: Merge commit '37b1453032488de582175270d1b3a1653ea81457', Andy Wingo, 2015/01/22
- [Guile-commits] 15/19: Merge commit '5943a62042432b86d757200ef595d7aebb5c9bac', Andy Wingo, 2015/01/22
- [Guile-commits] 18/19: Merge commit 'ed72201a795ac1c8d6c0288b6bb710f2bd0ebd9c', Andy Wingo, 2015/01/22
- [Guile-commits] 16/19: Merge commit '894d0b894daae001495c748b3352cd79918d3789', Andy Wingo, 2015/01/22
- [Guile-commits] 17/19: Merge commit '01a301d1b606b84d986b735049e7155d2f4cd6aa',
Andy Wingo <=
- [Guile-commits] 12/19: Merge commit '5d971db802eaa8038db17e1aa5b4c69452739744', Andy Wingo, 2015/01/22
- [Guile-commits] 19/19: Merge commit '5b7632331e7551ac202bbaba37c572b96a791c6e', Andy Wingo, 2015/01/22