# Use of murmur hash in st.c

**URL:** <https://www.ruby-forum.com/t/use-of-murmur-hash-in-st-c/176202>\
**Category:** Development\
**Created:** [September 26, 2009, 11:09am UTC](https://www.ruby-forum.com/t/use-of-murmur-hash-in-st-c/176202 "2009-09-26T11:09:53Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [September 26, 2009, 11:09am UTC](https://www.ruby-forum.com/t/use-of-murmur-hash-in-st-c/176202/1 "2009-09-26T11:09:53Z")

</div>

e$B$J$+$@$G$9!#e(B

String#hashe$B$K$Oe(BMurmurHashe$B$r;H$C$F$$$^$9$,!"e(Bstrhashe$B$O$^$@e(BFNV-1ae$B$Ne(B  
e$B$^$^$G$9!#e(Bst.ce$B$be(BMurmure$B$KE}0l$7$F$$$$$N$G$O$J$$$+$H;W$$$^$9!#e(B

# Index: include/ruby/intern.h

# — include/ruby/intern.h (revision 25102) +++ include/ruby/intern.h (working copy) @@ -640,4 +640,7 @@ st\_index\_t rb\_hash\_uint32(st\_index\_t, ui st\_index\_t rb\_hash\_uint(st\_index\_t, st\_index\_t); st\_index\_t rb\_hash\_end(st\_index\_t); +#define rb\_hash\_uint32(h, i) st\_hash\_uint32(h, i) +#define rb\_hash\_uint(h, i) st\_hash\_uint(h, i) +#define rb\_hash\_end(h) st\_hash\_end(h) st\_index\_t rb\_str\_hash(VALUE); int rb\_str\_hash\_cmp(VALUE,VALUE); Index: include/ruby/st.h

— include/ruby/st.h (revision 25102)  
+++ include/ruby/st.h (working copy)  
@@ -109,4 +109,10 @@ int st\_strcasecmp(const char \*s1, const  
int st\_strncasecmp(const char \*s1, const char \*s2, size\_t n);  
size\_t st\_memsize(const st\_table \*);  
+st\_index\_t st\_hash(const void \*ptr, size\_t len, st\_index\_t h);  
+st\_index\_t st\_hash\_uint32(st\_index\_t h, unsigned int i);  
+st\_index\_t st\_hash\_uint(st\_index\_t h, st\_index\_t i);  
+st\_index\_t st\_hash\_end(st\_index\_t h);  
+st\_index\_t st\_hash\_start(st\_index\_t h);  
+#define st\_hash\_start(h) (h)

# #if defined(\_\_cplusplus) Index: string.c

— string.c (revision 25102)  
+++ string.c (working copy)  
@@ -1977,243 +1977,16 @@ rb\_str\_concat(VALUE str1, VALUE str2)  
}

## -#ifndef UNALIGNED\_WORD\_ACCESS -# if defined **i386** || defined \_M\_IX86 -# define UNALIGNED\_WORD\_ACCESS 1 -# endif -#endif -#ifndef UNALIGNED\_WORD\_ACCESS -# define UNALIGNED\_WORD\_ACCESS 0 -#endif

## -/\* MurmurHash described in [http://murmurhash.googlepages.com/](http://murmurhash.googlepages.com/) \*/ -#ifndef MURMUR -#define MURMUR 2 -#endif

## -typedef char check\_murmur\_voidp[SIZEOF\_VOIDP == (int)sizeof(st\_index\_t) ? 1 : -1]; -#define SIZEOF\_ST\_INDEX\_T SIZEOF\_VOIDP

## -#if MURMUR == 1 -#define MurmurMagic 0xc6a4a793 -#elif MURMUR == 2 -#if SIZEOF\_ST\_INDEX\_T \> 4 -#define MurmurMagic 0xc6a4a7935bd1e995 -#else -#define MurmurMagic 0x5bd1e995 -#endif -#endif

-static inline st\_index\_t  
-murmur(st\_index\_t h, st\_index\_t k, int r)  
-{

- const st\_index\_t m = MurmurMagic;  
-#if MURMUR == 1
- h += k;
- h \*= m;
- h ^= h \>\> r;  
-#elif MURMUR == 2
- k \*= m;
- k ^= k \>\> r;
- k \*= m;
- 
- h \*= m;
- h ^= k;  
-#endif
- return h;  
-}
- 

-static inline st\_index\_t  
-murmur\_finish(st\_index\_t h)  
-{  
-#if MURMUR == 1

- h = murmur(h, 0, 10);
- h = murmur(h, 0, 17);  
-#elif MURMUR == 2
- h ^= h \>\> 13;
- h \*= MurmurMagic;
- h ^= h \>\> 15;  
-#endif
- return h;  
-}
- 

## -#define murmur\_step(h, k) murmur(h, k, 16)

## -#if MURMUR == 1 -#define murmur1(h) murmur\_step(h, 16) -#else -#define murmur1(h) murmur\_step(h, 24) -#endif

-static st\_index\_t  
-hash(const void \*ptr, size\_t len, st\_index\_t h)  
-{

- const char \*data = ptr;
- st\_index\_t t = 0;
- 
- h += 0xdeadbeef;
- 

-#define data\_at(n) (st\_index\_t)((unsigned char)data[n])  
-#define UNALIGNED\_ADD\_4 UNALIGNED\_ADD(2); UNALIGNED\_ADD(1);  
UNALIGNED\_ADD(0)  
-#if SIZEOF\_ST\_INDEX\_T \> 4  
-#define UNALIGNED\_ADD\_8 UNALIGNED\_ADD(6); UNALIGNED\_ADD(5);  
UNALIGNED\_ADD(4); UNALIGNED\_ADD(3); UNALIGNED\_ADD\_4  
-#if SIZEOF\_ST\_INDEX\_T \> 8  
-#define UNALIGNED\_ADD\_16 UNALIGNED\_ADD(14); UNALIGNED\_ADD(13);  
UNALIGNED\_ADD(12); UNALIGNED\_ADD(11); \

- UNALIGNED\_ADD(10); UNALIGNED\_ADD(9); UNALIGNED\_ADD(8);  
UNALIGNED\_ADD(7); UNALIGNED\_ADD\_8  
-#define UNALIGNED\_ADD\_ALL UNALIGNED\_ADD\_16  
-#endif  
-#define UNALIGNED\_ADD\_ALL UNALIGNED\_ADD\_8  
-#else  
-#define UNALIGNED\_ADD\_ALL UNALIGNED\_ADD\_4  
-#endif
- if (len \>= sizeof(st\_index\_t)) {  
-#if !UNALIGNED\_WORD\_ACCESS
- int align = (int)((st\_data\_t)data % sizeof(st\_index\_t));
- if (align) {
- 

```
 st_index_t d = 0;

```

- 

```
 int sl, sr, pack;

```

- 
- 

```
 switch (align) {

```

-#ifdef WORDS\_BIGENDIAN  
-# define UNALIGNED\_ADD(n) case SIZEOF\_ST\_INDEX\_T - (n) - 1: \

- t |= data\_at(n) \<\< CHAR\_BIT\*(SIZEOF\_ST\_INDEX\_T - (n) - 2)  
-#else  
-# define UNALIGNED\_ADD(n) case SIZEOF\_ST\_INDEX\_T - (n) - 1: \
- t |= data\_at(n) \<\< CHAR\_BIT\*(n)  
-#endif
- UNALIGNED\_ADD\_ALL;  
-#undef UNALIGNED\_ADD
- 

```
 }

```

- 

-#ifdef WORDS\_BIGENDIAN

- 

```
 t >>= (CHAR_BIT * align) - CHAR_BIT;

```

-#else

- 

```
 t <<= (CHAR_BIT * align);

```

## -#endif

- 

```
 data += sizeof(st_index_t)-align;

```

- 

```
 len -= sizeof(st_index_t)-align;

```

- 
- 

```
 sl = CHAR_BIT * (SIZEOF_ST_INDEX_T-align);

```

- 

```
 sr = CHAR_BIT * align;

```

- 
- 

```
 while (len >= sizeof(st_index_t)) {

```

- d = \*(st\_index\_t \*)data;  
-#ifdef WORDS\_BIGENDIAN
- t = (t \<\< sr) | (d \>\> sl);  
-#else
- t = (t \>\> sr) | (d \<\< sl);  
-#endif
- h = murmur\_step(h, t);
- t = d;
- data += sizeof(st\_index\_t);
- len -= sizeof(st\_index\_t);
- 

```
 }

```

- 
- 

```
 pack = len < (size_t)align ? (int)len : align;

```

- 

```
 d = 0;

```

- 

```
 switch (pack) {

```

-#ifdef WORDS\_BIGENDIAN  
-# define UNALIGNED\_ADD(n) case (n) + 1: \

- d |= data\_at(n) \<\< CHAR\_BIT\*(SIZEOF\_ST\_INDEX\_T - (n) - 1)  
-#else  
-# define UNALIGNED\_ADD(n) case (n) + 1: \
- d |= data\_at(n) \<\< CHAR\_BIT\*(n)  
-#endif
- UNALIGNED\_ADD\_ALL;  
-#undef UNALIGNED\_ADD
- 

```
 }

```

-#ifdef WORDS\_BIGENDIAN

- 

```
 t = (t << sr) | (d >> sl);

```

-#else

- 

```
 t = (t >> sr) | (d << sl);

```

## -#endif

-#if MURMUR == 2

- 

```
 if (len < (size_t)align) goto skip_tail;

```

-#endif

- 

```
 h = murmur_step(h, t);

```

- 

```
 data += pack;

```

- 

```
 len -= pack;

```

- }
- else  
-#endif
- {
- 

```
 do {

```

- h = murmur\_step(h, \*(st\_index\_t \*)data);
- data += sizeof(st\_index\_t);
- len -= sizeof(st\_index\_t);
- 

```
 } while (len >= sizeof(st_index_t));

```

- }
- }
- 
- t = 0;
- switch (len) {  
-#ifdef WORDS\_BIGENDIAN  
-# define UNALIGNED\_ADD(n) case (n) + 1: \
- t |= data\_at(n) \<\< CHAR\_BIT\*(SIZEOF\_ST\_INDEX\_T - (n) - 1)  
-#else  
-# define UNALIGNED\_ADD(n) case (n) + 1: \
- t |= data\_at(n) \<\< CHAR\_BIT\*(n)  
-#endif
- UNALIGNED\_ADD\_ALL;  
-#undef UNALIGNED\_ADD  
-#if MURMUR == 1
- h = murmur\_step(h, t);  
-#elif MURMUR == 2  
-# if !UNALIGNED\_WORD\_ACCESS
- 

```
 skip_tail:

```

-# endif

- h ^= t;
- h \*= MurmurMagic;  
-#endif
- }
- 
- return murmur\_finish(h);  
-}
- 

-st\_index\_t  
-rb\_hash\_uint32(st\_index\_t h, uint32\_t i)  
-{

- return murmur\_step(h + i, 16);  
-}
- 

-st\_index\_t  
-rb\_hash\_uint(st\_index\_t h, st\_index\_t i)  
-{

- st\_index\_t v = 0;
- h += i;  
-#ifdef WORDS\_BIGENDIAN  
-#if SIZEOF\_ST\_INDEX\_T_CHAR\_BIT \> 12_8
- v = murmur1(v + (h \>\> 12_8));  
-#endif  
-#if SIZEOF\_ST\_INDEX\_T_CHAR\_BIT \> 8\*8
- v = murmur1(v + (h \>\> 8_8));  
-#endif  
-#if SIZEOF\_ST\_INDEX\_T_CHAR\_BIT \> 4\*8
- v = murmur1(v + (h \>\> 4\*8));  
-#endif  
-#endif
- v = murmur1(v + h);  
-#ifndef WORDS\_BIGENDIAN  
-#if SIZEOF\_ST\_INDEX\_T_CHAR\_BIT \> 4_8
- v = murmur1(v + (h \>\> 4_8));  
-#endif  
-#if SIZEOF\_ST\_INDEX\_T_CHAR\_BIT \> 8\*8
- v = murmur1(v + (h \>\> 8_8));  
-#endif  
-#if SIZEOF\_ST\_INDEX\_T_CHAR\_BIT \> 12\*8
- v = murmur1(v + (h \>\> 12\*8));  
-#endif  
-#endif
- return v;  
-}
- 

-st\_index\_t  
-rb\_hash\_end(st\_index\_t h)  
-{

- h = murmur\_step(h, 10);
- h = murmur\_step(h, 17);
- return h;  
-}  
+#undef rb\_hash\_uint32  
+#undef rb\_hash\_uint  
+#undef rb\_hash\_end  
+RUBY\_ALIAS\_FUNCTION\_TYPE(st\_index\_t,

- 

```
  rb_hash_uint32(st_index_t h, unsigned int i),

```

- 

```
  st_hash_uint32, (h, i));

```

+RUBY\_ALIAS\_FUNCTION\_TYPE(st\_index\_t,

- 

```
  rb_hash_uint(st_index_t h, st_index_t i),

```

- 

```
  st_hash_uint, (h, i));

```

+RUBY\_ALIAS\_FUNCTION\_TYPE(st\_index\_t,

- 

```
  rb_hash_end(st_index_t h),

```

- 

```
  st_hash_end, (h));

```

st\_index\_t  
@@ -2240,5 +2013,5 @@ rb\_hash\_start(st\_index\_t h)  
}

- return hashseed + h;

- return st\_hash\_start(hashseed + h);  
}

@@ -2246,5 +2019,5 @@ st\_index\_t  
rb\_memhash(const void \*ptr, long len)  
{

- return hash(ptr, len, rb\_hash\_start(0));

- return st\_hash(ptr, len, rb\_hash\_start(0));  
}

# Index: st.c

— st.c (revision 25102)  
+++ st.c (working copy)  
@@ -967,4 +967,5 @@ st\_reverse\_foreach(st\_table \*table, int  
#define FNV\_32\_PRIME 0x01000193

+#ifdef ST\_USE\_FNV1  
static st\_index\_t  
strhash(st\_data\_t arg)  
@@ -985,4 +986,260 @@ strhash(st\_data\_t arg)  
return hval;  
}  
+#else  
+  
+#ifndef UNALIGNED\_WORD\_ACCESS  
+# if defined **i386** || defined \_M\_IX86  
+# define UNALIGNED\_WORD\_ACCESS 1  
+# endif  
+#endif  
+#ifndef UNALIGNED\_WORD\_ACCESS  
+# define UNALIGNED\_WORD\_ACCESS 0  
+#endif  
+  
+/\* MurmurHash described in [http://murmurhash.googlepages.com/](http://murmurhash.googlepages.com/) \*/  
+#ifndef MURMUR  
+#define MURMUR 2  
+#endif  
+  
+typedef char check\_murmur\_voidp[SIZEOF\_VOIDP == (int)sizeof(st\_index\_t)  
? 1 : -1];  
+#define SIZEOF\_ST\_INDEX\_T SIZEOF\_VOIDP  
+  
+#if MURMUR == 1  
+#define MurmurMagic 0xc6a4a793  
+#elif MURMUR == 2  
+#if SIZEOF\_ST\_INDEX\_T \> 4  
+#define MurmurMagic 0xc6a4a7935bd1e995  
+#else  
+#define MurmurMagic 0x5bd1e995  
+#endif  
+#endif  
+  
+static inline st\_index\_t  
+murmur(st\_index\_t h, st\_index\_t k, int r)  
+{

- const st\_index\_t m = MurmurMagic;  
+#if MURMUR == 1
- h += k;
- h \*= m;
- h ^= h \>\> r;  
+#elif MURMUR == 2
- k \*= m;
- k ^= k \>\> r;
- k \*= m;
- 
- h \*= m;
- h ^= k;  
+#endif
- return h;  
+}
- 

+static inline st\_index\_t  
+murmur\_finish(st\_index\_t h)  
+{  
+#if MURMUR == 1

- h = murmur(h, 0, 10);
- h = murmur(h, 0, 17);  
+#elif MURMUR == 2
- h ^= h \>\> 13;
- h \*= MurmurMagic;
- h ^= h \>\> 15;  
+#endif
- return h;  
+}
- 

+#define murmur\_step(h, k) murmur(h, k, 16)  
+  
+#if MURMUR == 1  
+#define murmur1(h) murmur\_step(h, 16)  
+#else  
+#define murmur1(h) murmur\_step(h, 24)  
+#endif  
+  
+st\_index\_t  
+st\_hash(const void \*ptr, size\_t len, st\_index\_t h)  
+{

- const char \*data = ptr;
- st\_index\_t t = 0;
- 
- h += 0xdeadbeef;
- 

+#define data\_at(n) (st\_index\_t)((unsigned char)data[n])  
+#define UNALIGNED\_ADD\_4 UNALIGNED\_ADD(2); UNALIGNED\_ADD(1);  
UNALIGNED\_ADD(0)  
+#if SIZEOF\_ST\_INDEX\_T \> 4  
+#define UNALIGNED\_ADD\_8 UNALIGNED\_ADD(6); UNALIGNED\_ADD(5);  
UNALIGNED\_ADD(4); UNALIGNED\_ADD(3); UNALIGNED\_ADD\_4  
+#if SIZEOF\_ST\_INDEX\_T \> 8  
+#define UNALIGNED\_ADD\_16 UNALIGNED\_ADD(14); UNALIGNED\_ADD(13);  
UNALIGNED\_ADD(12); UNALIGNED\_ADD(11); \

- UNALIGNED\_ADD(10); UNALIGNED\_ADD(9); UNALIGNED\_ADD(8);  
UNALIGNED\_ADD(7); UNALIGNED\_ADD\_8  
+#define UNALIGNED\_ADD\_ALL UNALIGNED\_ADD\_16  
+#endif  
+#define UNALIGNED\_ADD\_ALL UNALIGNED\_ADD\_8  
+#else  
+#define UNALIGNED\_ADD\_ALL UNALIGNED\_ADD\_4  
+#endif
- if (len \>= sizeof(st\_index\_t)) {  
+#if !UNALIGNED\_WORD\_ACCESS
- int align = (int)((st\_data\_t)data % sizeof(st\_index\_t));
- if (align) {
- 

```
 st_index_t d = 0;

```

- 

```
 int sl, sr, pack;

```

- 
- 

```
 switch (align) {

```

+#ifdef WORDS\_BIGENDIAN  
+# define UNALIGNED\_ADD(n) case SIZEOF\_ST\_INDEX\_T - (n) - 1: \

- t |= data\_at(n) \<\< CHAR\_BIT\*(SIZEOF\_ST\_INDEX\_T - (n) - 2)  
+#else  
+# define UNALIGNED\_ADD(n) case SIZEOF\_ST\_INDEX\_T - (n) - 1: \
- t |= data\_at(n) \<\< CHAR\_BIT\*(n)  
+#endif
- UNALIGNED\_ADD\_ALL;  
+#undef UNALIGNED\_ADD
- 

```
 }

```

- 

+#ifdef WORDS\_BIGENDIAN

- 

```
 t >>= (CHAR_BIT * align) - CHAR_BIT;

```

+#else

- 

```
 t <<= (CHAR_BIT * align);

```

+#endif  
+

- 

```
 data += sizeof(st_index_t)-align;

```

- 

```
 len -= sizeof(st_index_t)-align;

```

- 
- 

```
 sl = CHAR_BIT * (SIZEOF_ST_INDEX_T-align);

```

- 

```
 sr = CHAR_BIT * align;

```

- 
- 

```
 while (len >= sizeof(st_index_t)) {

```

- d = \*(st\_index\_t \*)data;  
+#ifdef WORDS\_BIGENDIAN
- t = (t \<\< sr) | (d \>\> sl);  
+#else
- t = (t \>\> sr) | (d \<\< sl);  
+#endif
- h = murmur\_step(h, t);
- t = d;
- data += sizeof(st\_index\_t);
- len -= sizeof(st\_index\_t);
- 

```
 }

```

- 
- 

```
 pack = len < (size_t)align ? (int)len : align;

```

- 

```
 d = 0;

```

- 

```
 switch (pack) {

```

+#ifdef WORDS\_BIGENDIAN  
+# define UNALIGNED\_ADD(n) case (n) + 1: \

- d |= data\_at(n) \<\< CHAR\_BIT\*(SIZEOF\_ST\_INDEX\_T - (n) - 1)  
+#else  
+# define UNALIGNED\_ADD(n) case (n) + 1: \
- d |= data\_at(n) \<\< CHAR\_BIT\*(n)  
+#endif
- UNALIGNED\_ADD\_ALL;  
+#undef UNALIGNED\_ADD
- 

```
 }

```

+#ifdef WORDS\_BIGENDIAN

- 

```
 t = (t << sr) | (d >> sl);

```

+#else

- 

```
 t = (t >> sr) | (d << sl);

```

+#endif  
+  
+#if MURMUR == 2

- 

```
 if (len < (size_t)align) goto skip_tail;

```

+#endif

- 

```
 h = murmur_step(h, t);

```

- 

```
 data += pack;

```

- 

```
 len -= pack;

```

- }
- else  
+#endif
- {
- 

```
 do {

```

- h = murmur\_step(h, \*(st\_index\_t \*)data);
- data += sizeof(st\_index\_t);
- len -= sizeof(st\_index\_t);
- 

```
 } while (len >= sizeof(st_index_t));

```

- }
- }
- 
- t = 0;
- switch (len) {  
+#ifdef WORDS\_BIGENDIAN  
+# define UNALIGNED\_ADD(n) case (n) + 1: \
- t |= data\_at(n) \<\< CHAR\_BIT\*(SIZEOF\_ST\_INDEX\_T - (n) - 1)  
+#else  
+# define UNALIGNED\_ADD(n) case (n) + 1: \
- t |= data\_at(n) \<\< CHAR\_BIT\*(n)  
+#endif
- UNALIGNED\_ADD\_ALL;  
+#undef UNALIGNED\_ADD  
+#if MURMUR == 1
- h = murmur\_step(h, t);  
+#elif MURMUR == 2  
+# if !UNALIGNED\_WORD\_ACCESS
- 

```
 skip_tail:

```

+# endif

- h ^= t;
- h \*= MurmurMagic;  
+#endif
- }
- 
- return murmur\_finish(h);  
+}
- 

+st\_index\_t  
+st\_hash\_uint32(st\_index\_t h, uint32\_t i)  
+{

- return murmur\_step(h + i, 16);  
+}
- 

+st\_index\_t  
+st\_hash\_uint(st\_index\_t h, st\_index\_t i)  
+{

- st\_index\_t v = 0;
- h += i;  
+#ifdef WORDS\_BIGENDIAN  
+#if SIZEOF\_ST\_INDEX\_T_CHAR\_BIT \> 12_8
- v = murmur1(v + (h \>\> 12_8));  
+#endif  
+#if SIZEOF\_ST\_INDEX\_T_CHAR\_BIT \> 8\*8
- v = murmur1(v + (h \>\> 8_8));  
+#endif  
+#if SIZEOF\_ST\_INDEX\_T_CHAR\_BIT \> 4\*8
- v = murmur1(v + (h \>\> 4\*8));  
+#endif  
+#endif
- v = murmur1(v + h);  
+#ifndef WORDS\_BIGENDIAN  
+#if SIZEOF\_ST\_INDEX\_T_CHAR\_BIT \> 4_8
- v = murmur1(v + (h \>\> 4_8));  
+#endif  
+#if SIZEOF\_ST\_INDEX\_T_CHAR\_BIT \> 8\*8
- v = murmur1(v + (h \>\> 8_8));  
+#endif  
+#if SIZEOF\_ST\_INDEX\_T_CHAR\_BIT \> 12\*8
- v = murmur1(v + (h \>\> 12\*8));  
+#endif  
+#endif
- return v;  
+}
- 

+st\_index\_t  
+st\_hash\_end(st\_index\_t h)  
+{

- h = murmur\_step(h, 10);
- h = murmur\_step(h, 17);
- return h;  
+}
- 

+#undef st\_hash\_start  
+st\_index\_t  
+st\_hash\_start(st\_index\_t h)  
+{

- return h;  
+}
- 

+static st\_index\_t  
+strhash(st\_data\_t arg)  
+{

- register const char \*string = (const char \*)arg;
- return st\_hash(string, strlen(string), FNV1\_32A\_INIT);  
+}  
+#endif

int

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [September 26, 2009, 4:20pm UTC](https://www.ruby-forum.com/t/use-of-murmur-hash-in-st-c/176202/2 "2009-09-26T16:20:41Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:39376] use of murmur hash in st.c”  
on Sat, 26 Sep 2009 18:09:27 +0900, Nobuyoshi N.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

|String#hashe$B$K$Oe(BMurmurHashe$B$r;H$C$F$$$^$9$,!"e(Bstrhashe$B$O$^$@e(BFNV-1ae$B$Ne(B  
|e$B$^$^$G$9!#e(Bst.ce$B$be(BMurmure$B$KE}0l$7$F$$$$$N$G$O$J$$$+$H;W$$$^$9!#e(B

e$B$\*4j$$$7$^$9!#e(B
