diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | intern.h | 1 | ||||
-rw-r--r-- | numeric.c | 8 | ||||
-rw-r--r-- | string.c | 17 |
4 files changed, 21 insertions, 12 deletions
@@ -1,3 +1,10 @@ +Wed Aug 30 12:01:57 2006 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * numeric.c (flo_hash): improve collision. + + * string.c (rb_memhash): new generic function to calculate hash value + for memory chunk. + Tue Aug 29 19:10:10 2006 Nobuyoshi Nakada <nobu@ruby-lang.org> * hash.c (rb_hash_s_create): fixed memory leak, based on the patch @@ -502,6 +502,7 @@ VALUE rb_str_cat(VALUE, const char*, long); VALUE rb_str_cat2(VALUE, const char*); VALUE rb_str_append(VALUE, VALUE); VALUE rb_str_concat(VALUE, VALUE); +int rb_memhash(const void *ptr, long len); int rb_str_hash(VALUE); int rb_str_cmp(VALUE, VALUE); VALUE rb_str_upto(VALUE, VALUE, int); @@ -836,15 +836,11 @@ static VALUE flo_hash(VALUE num) { double d; - char *c; - int i, hash; + int hash; d = RFLOAT(num)->value; if (d == 0) d = fabs(d); - c = (char*)&d; - for (hash=0, i=0; i<sizeof(double);i++) { - hash += c[i] * 971; - } + hash = rb_memhash(&d, sizeof(d)) ^ RBASIC(num)->klass; if (hash < 0) hash = -hash; return INT2FIX(hash); } @@ -768,9 +768,9 @@ rb_str_concat(VALUE str1, VALUE str2) /* * hash_32 - 32 bit Fowler/Noll/Vo FNV-1a hash code * - * @(#) $Revision$ - * @(#) $Id$ - * @(#) $Source$ + * @(#) $hash_32.Revision: 1.1 $ + * @(#) $hash_32.Id: hash_32a.c,v 1.1 2003/10/03 20:38:53 chongo Exp $ + * @(#) $hash_32.Source: /usr/local/src/cmd/fnv/RCS/hash_32a.c,v $ * *** * @@ -841,10 +841,9 @@ rb_str_concat(VALUE str1, VALUE str2) #define FNV_32_PRIME 0x01000193 int -rb_str_hash(VALUE str) +rb_memhash(const void *ptr, long len) { - register long len = RSTRING(str)->len; - register char *p = RSTRING(str)->ptr; + register const unsigned char *p = ptr; register unsigned int hval = FNV1_32A_INIT; /* @@ -864,6 +863,12 @@ rb_str_hash(VALUE str) return hval; } +int +rb_str_hash(VALUE str) +{ + return rb_memhash(RSTRING(str)->ptr, RSTRING(str)->len); +} + /* * call-seq: * str.hash => fixnum |