summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorknu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-11-01 16:16:31 +0000
committerknu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-11-01 16:16:31 +0000
commitfe85bcd644d60f7665ed2688b91c28c3def01526 (patch)
tree29db2cd02a6139cde66ebee2ad7fe75f39a86dae
parent92160dc6d0ca0ce81f551c2ec300b570b44b945c (diff)
* string.c (rb_str_hash): Update the HASH_PERL alternative hash
algorithm in sync with Perl 5.8. * st.c (strhash): Ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4886 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog7
-rw-r--r--st.c8
-rw-r--r--string.c8
3 files changed, 19 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 26d43258f8..bb99e4859a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Sun Nov 2 01:02:04 2003 Akinori MUSHA <knu@iDaemons.org>
+
+ * string.c (rb_str_hash): Update the HASH_PERL alternative hash
+ algorithm in sync with Perl 5.8.
+
+ * st.c (strhash): Ditto.
+
Sat Nov 1 18:21:09 2003 GOTOU Yuuzou <gotoyuzo@notwork.org>
* ext/openssl/ossl_ssl.c (ossl_ssl_peer_cert_chain): add new method
diff --git a/st.c b/st.c
index 1cc0e2f4d7..753dce9a02 100644
--- a/st.c
+++ b/st.c
@@ -536,10 +536,14 @@ strhash(string)
register int val = 0;
while ((c = *string++) != '\0') {
- val = val*33 + c;
+ val += c;
+ val += (val << 10);
+ val ^= (val >> 6);
}
+ val += (val << 3);
+ val ^= (val >> 11);
- return val + (val>>5);
+ return val + (val << 15);
#else
register int val = 0;
diff --git a/string.c b/string.c
index 29c3cea63b..2d991f6e53 100644
--- a/string.c
+++ b/string.c
@@ -744,9 +744,13 @@ rb_str_hash(str)
}
#elif HASH_PERL
while (len--) {
- key = key*33 + *p++;
+ key += *p++;
+ key += (key << 10);
+ key ^= (key >> 6);
}
- key = key + (key>>5);
+ key += (key << 3);
+ key ^= (key >> 11);
+ key += (key << 15);
#else
while (len--) {
key = key*65599 + *p;