# String#hash

**URL:** <https://www.ruby-forum.com/t/string-hash/157891>\
**Category:** Development\
**Created:** [January 16, 2009, 12:01pm UTC](https://www.ruby-forum.com/t/string-hash/157891 "2009-01-16T12:01:50Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [January 16, 2009, 12:01pm UTC](https://www.ruby-forum.com/t/string-hash/157891/1 "2009-01-16T12:01:50Z")

</div>

e$B$1$$$8$e!w$$$7$D$+$G$9e(B.

Ruby1.9e$B7O$Ne(B String#hash e$B$H$$$&$+e(B e$B$9$Y$F$Ne(B  
hashe$B4X?t$K$D$$$F$G$9$,e(B,  
e$B%W%m%;%9Kh$K0c$&CM$K$J$k$N$G$9$,e(B,  
e$B2?$+?\<$$M}M3$,$"$k$N$G$7$g$&$+e(B?

e$BB\>$N%O%C%7%e4X?te(B(SHA1e$BEye(B)e$B$HF1$8$/e(B,  
e$B%W%m%;%9$K0MB8$;$:e(B, e$B8GDjCM$NJ}$,NI$$e(B  
e$B5$$,$9$k$N$G$9$,e(B?

MurmurHashe$B$@$H3N$+$Ke(Bseede$B$rM?$($k$h$&$K$J$C$F$$$^$9$,e(B,  
e$B:#$Ne(BRuby1.9e$B$NMMe(B  
e$B$J;H$$J}$N$?$a$G$O$J$$5$$,$7$^$9e(B.

e$BNc$($Pe(B, Complexe$B$@$He(B

@real.hash ^ @imag.hash

e$B$H$J$C$F$$$^$9e(B. e$B\<B:]$K$Oe(B, e$B$3$l$O$"$^$jNI$/$J$/$Fe(B,  
@real==@image e$B$N$H$-e(B  
e$B$D$M$KF1$8CM$K$J$C$F$7$^$$$^$9e(B. e$B$=$3$Ge(B,  
e$BJL$Ne(Bseede$B$rM?$(e(B

@real.hash(seed1) ^ @image.hash(seed2)

e$B$NMM$K$9$k$He(B, e$B\>e5-$NLdBj$O$J$/$J$j$^$9e(B. e$B$3$l$Oe(B,  
Arraye$BEy$Ne(Bhashe$B4X?t$G$be(B  
e$BF1MM$G$9e(B. e$B$^$?e(B,  
Fixnum#hashe$B$He(BObject#hashe$B$bJL$Ne(Bseede$B$rM?$($k$N$b$h$5$=$&e(B  
e$B$J5$$,$7$^$9e(B.

\_\_  
----------------------------------------------------\>\> e$B@PDMe(B  
e$B7=\<ye(B \<\<—  
----------------------------------\>\> e-mail: removed\_email\_address@domain.invalid \<\<—

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [January 16, 2009, 12:52pm UTC](https://www.ruby-forum.com/t/string-hash/157891/2 "2009-01-16T12:52:35Z")

</div>

In article [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid),  
removed\_email\_address@domain.invalid (Keiju ISHITSUKA) writes:

> Ruby1.9e$B7O$Ne(B String#hash e$B$H$$$&$+e(B e$B$9$Y$F$Ne(B hashe$B4X?t$K$D$$$F$G$9$,e(B,  
> e$B%W%m%;%9Kh$K0c$&CM$K$J$k$N$G$9$,e(B, e$B2?$+?\<$$M}M3$,$"$k$N$G$7$g$&$+e(B?

algorithmic complexity attack e$BBP:v$G$9!#e(B

[http://www.cs.rice.edu/~scrosby/hash/CrosbyWallach\_UsenixSec2003/](http://www.cs.rice.edu/~scrosby/hash/CrosbyWallach_UsenixSec2003/)

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [January 17, 2009, 8:35am UTC](https://www.ruby-forum.com/t/string-hash/157891/3 "2009-01-17T08:35:12Z")

</div>

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

In message “Re: [ruby-dev:37777] String#hash”  
on Fri, 16 Jan 2009 20:00:08 +0900, removed\_email\_address@domain.invalid (Keiju  
ISHITSUKA) writes:

|e$BNc$($Pe(B, Complexe$B$@$He(B  
|  
| @real.hash ^ @imag.hash  
|  
|e$B$H$J$C$F$$$^$9e(B. e$B\<B:]$K$Oe(B, e$B$3$l$O$"$^$jNI$/$J$/$Fe(B, @real==@image e$B$N$H$-e(B  
|e$B$D$M$KF1$8CM$K$J$C$F$7$^$$$^$9e(B. e$B$=$3$Ge(B, e$BJL$Ne(Bseede$B$rM?$(e(B  
|  
| @real.hash(seed1) ^ @image.hash(seed2)  
|  
|e$B$NMM$K$9$k$He(B, e$B\>e5-$NLdBj$O$J$/$J$j$^$9e(B. e$B$3$l$Oe(B, Arraye$BEy$Ne(Bhashe$B4X?t$G$be(B  
|e$BF1MM$G$9e(B. e$B$^$?e(B, Fixnum#hashe$B$He(BObject#hashe$B$bJL$Ne(Bseede$B$rM?$($k$N$b$h$5$=$&e(B  
|e$B$J5$$,$7$^$9e(B.

e$BKh2sJQ$o$kM}M3$Oe(B[ruby-dev:37778]e$B$NDL$j$J$s$G$9$,!"3F%\*%V%8%'e(B  
e$B%/%H$Ne(Bhashe$B$N7W;;J}\<0$r99?7$7$?J}$,NI$$$H$$$&Ds0F$O$=$l$H$OFHe(B  
e$BN)$KM-8z$@$H;W$$$^$9!#$I$s$J7W;;\<0$,NI$$$N$+5DO@$7$F$$$?$@$1e(B  
e$B$^$;$s$+!)e(B

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [January 19, 2009, 9:42am UTC](https://www.ruby-forum.com/t/string-hash/157891/4 "2009-01-19T09:42:50Z")

</div>

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

At Mon, 19 Jan 2009 05:28:18 +0900,  
Nobuyoshi N. wrote in [ruby-dev:37784]:

> e$B$7$+$7!“e(BMurmurHashe$B$C$FESCf$G$?$^$?$^e(B0e$B$K$J$k$H$=$l0J9\_$N%G!\<%?$Oe(B  
> e$BL54X78$K$J$k$h$&$J5$$,$9$k$s$G$9$,!”$$$$$s$G$7$g$&$+!#e(B

e$B$9$$$^$;$s!"%%1$F$^$7$?!#$3$l$O40A4$K4\*0c$$$G$9!#e(B

e$B$@$+$i$H$$$&$o$1$G$O$"$j$^$;$s$,!"e(BMurmurHash2.0e$B$H$$$&$b$N$,=P$Fe(B  
e$B$$$?$N$G$=$A$i$K:9$7BX$($F$\_$^$7$?!#G\6a$/B.$/$J$k$h$&$G$9!#e(B

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [January 18, 2009, 9:30pm UTC](https://www.ruby-forum.com/t/string-hash/157891/5 "2009-01-18T21:30:13Z")

</div>

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

At Sat, 17 Jan 2009 16:33:08 +0900,  
Yukihiro M. wrote in [ruby-dev:37779]:

> |e$BF1MM$G$9e(B. e$B$^$?e(B, Fixnum#hashe$B$He(BObject#hashe$B$bJL$Ne(Bseede$B$rM?$($k$N$b$h$5$=$&e(B  
> |e$B$J5$$,$7$^$9e(B.
> 
> e$BKh2sJQ$o$kM}M3$Oe(B[ruby-dev:37778]e$B$NDL$j$J$s$G$9$,!"3F%\*%V%8%'e(B  
> e$B%/%H$Ne(Bhashe$B$N7W;;J}\<0$r99?7$7$?J}$,NI$$$H$$$&Ds0F$O$=$l$H$OFHe(B  
> e$BN)$KM-8z$@$H;W$$$^$9!#$I$s$J7W;;\<0$,NI$$$N$+5DO@$7$F$$$?$@$1e(B  
> e$B$^$;$s$+!)e(B

Complexe$B$de(BRationale$B$Oe(Brb\_memhash()e$B$,;H$($k$H;W$$$^$9$,!"2DJQD9$G$"e(B  
e$B$ke(BArraye$B$de(BObjecte$B!"e(BStructe$B$J$I$G$OB?\>/9)IW$,I,MW$G$7$g$&!#e(B

e$B$7$+$7!“e(BMurmurHashe$B$C$FESCf$G$?$^$?$^e(B0e$B$K$J$k$H$=$l0J9\_$N%G!\<%?$Oe(B  
e$BL54X78$K$J$k$h$&$J5$$,$9$k$s$G$9$,!”$$$$$s$G$7$g$&$+!#e(B

# Index: array.c

— array.c (revision 21650)  
+++ array.c (working copy)  
@@ -2722,10 +2722,10 @@ recursive\_hash(VALUE ary, VALUE dummy, i  
return LONG2FIX(0);  
}

- h = RARRAY\_LEN(ary);

- h = rb\_hash\_start(RARRAY\_LEN(ary));  
for (i=0; i\<RARRAY\_LEN(ary); i++) {

- h = (h \<\< 1) | (h\<0 ? 1 : 0);  
n = rb\_hash(RARRAY\_PTR(ary)[i]);
- h ^= NUM2LONG(n);

- h = rb\_hash\_uint(h, NUM2LONG(n));  
}
- h = rb\_hash\_end(h);  
return LONG2FIX(h);  
}  
Index: complex.c  
===================================================================  
— complex.c (revision 21650)  
+++ complex.c (working copy)  
@@ -23,5 +23,5 @@ VALUE rb\_cComplex;

static ID id\_abs, id\_abs2, id\_arg, id\_cmp, id\_conj, id\_convert,

- id\_denominator, id\_divmod, id\_equal\_p, id\_expt, id\_floor, id\_hash,

- id\_denominator, id\_divmod, id\_equal\_p, id\_expt, id\_floor,  
id\_idiv, id\_inspect, id\_negate, id\_numerator, id\_polar, id\_quo,  
id\_real\_p, id\_to\_f, id\_to\_i, id\_to\_r, id\_to\_s;  
@@ -154,6 +154,4 @@ f\_sub(VALUE x, VALUE y)  
}

## -binop(xor, ‘^’)

fun1(abs)  
fun1(abs2)  
@@ -162,5 +160,4 @@ fun1(conj)  
fun1(denominator)  
fun1(floor)  
-fun1(hash)  
fun1(inspect)  
fun1(negate)  
@@ -858,6 +855,15 @@ static VALUE  
nucomp\_hash(VALUE self)  
{

- long v, h[3];
- VALUE n;
- get\_dat1(self);

- return f\_xor(f\_hash(dat-\>real), f\_hash(dat-\>imag));

- h[0] = rb\_hash(rb\_obj\_class(self));
- n = rb\_hash(dat-\>real);
- h[1] = NUM2LONG(n);
- n = rb\_hash(dat-\>imag);
- h[2] = NUM2LONG(n);
- v = rb\_memhash(h, sizeof(h));
- return LONG2FIX(v);  
}

@@ -1383,5 +1389,4 @@ Init\_Complex(void)  
id\_expt = rb\_intern(“\*\*”);  
id\_floor = rb\_intern(“floor”);

- id\_hash = rb\_intern(“hash”);  
id\_idiv = rb\_intern(“div”);  
id\_inspect = rb\_intern(“inspect”);  
Index: hash.c  
===================================================================  
— hash.c (revision 21650)  
+++ hash.c (working copy)  
@@ -70,5 +70,5 @@ rb\_any\_hash(VALUE a)  
case T\_FIXNUM:  
case T\_SYMBOL:
- hnum = (int)a;

- hnum = rb\_hash\_end(rb\_hash\_start((unsigned int)a));  
break;

@@ -1511,7 +1511,10 @@ static int  
hash\_i(VALUE key, VALUE val, int \*hval)  
{

- VALUE n;  
if (key == Qundef) return ST\_CONTINUE;

- \*hval ^= rb\_hash(key);
- \*hval ^= rb\_hash(val);

- n = rb\_hash(key);
- \*hval = rb\_hash\_uint(\*hval, NUM2LONG(n));
- n = rb\_hash(val);
- \*hval = rb\_hash\_uint(\*hval, NUM2LONG(n));  
return ST\_CONTINUE;  
}  
@@ -1527,6 +1530,7 @@ recursive\_hash(VALUE hash, VALUE dummy,  
if (!RHASH(hash)-\>ntbl)  
return LONG2FIX(0);

- hval = RHASH(hash)-\>ntbl-\>num\_entries;

- hval = rb\_hash\_start(RHASH(hash)-\>ntbl-\>num\_entries);  
rb\_hash\_foreach(hash, hash\_i, (st\_data\_t)&hval);
- hval = rb\_hash\_end(hval);  
return INT2FIX(hval);  
}  
Index: gc.c  
===================================================================  
— gc.c (revision 21650)  
+++ gc.c (working copy)  
@@ -2904,5 +2904,4 @@ Init\_GC(void)  
OBJ\_FREEZE(nomem\_error);

- rb\_define\_method(rb\_mKernel, “hash”, rb\_obj\_id, 0);  
rb\_define\_method(rb\_mKernel, “ **id** ”, rb\_obj\_id, 0);  
rb\_define\_method(rb\_mKernel, “object\_id”, rb\_obj\_id, 0);  
Index: object.c  
===================================================================  
— object.c (revision 21650)  
+++ object.c (working copy)  
@@ -96,4 +96,12 @@ rb\_obj\_equal(VALUE obj1, VALUE obj2)  
}

+VALUE  
+rb\_obj\_hash(VALUE obj)  
+{

- VALUE oid = rb\_obj\_id(obj);
- unsigned h = rb\_hash\_end(rb\_hash\_start(NUM2LONG(oid)));
- return LONG2NUM(h);  
+}
- 

/\*

- call-seq:  
@@ -2517,4 +2525,5 @@ Init\_Object(void)  
rb\_define\_method(rb\_mKernel, “!~”, rb\_obj\_not\_match, 1);  
rb\_define\_method(rb\_mKernel, “eql?”, rb\_obj\_equal, 1);

- rb\_define\_method(rb\_mKernel, “hash”, rb\_obj\_hash, 0);

- long hash = EXCL(range);

- unsigned hash = EXCL(range);  
VALUE v;

- hash = rb\_hash\_start(hash);  
v = rb\_hash(RANGE\_BEG(range));

- hash ^= v \<\< 1;

- hash = rb\_hash\_uint(hash, NUM2LONG(v));  
v = rb\_hash(RANGE\_END(range));

- hash ^= v \<\< 9;
- hash ^= EXCL(range) \<\< 24;

- hash = rb\_hash\_uint(hash, NUM2LONG(v));

- hash = rb\_hash\_uint(hash, EXCL(range) \<\< 24);

- hash = rb\_hash\_end(hash);

static ID id\_abs, id\_cmp, id\_convert, id\_equal\_p, id\_expt, id\_floor,

- id\_hash, id\_idiv, id\_inspect, id\_integer\_p, id\_negate, id\_to\_f,

- id\_idiv, id\_inspect, id\_integer\_p, id\_negate, id\_to\_f,  
id\_to\_i, id\_to\_s, id\_truncate;

@@ -136,9 +136,6 @@ f\_sub(VALUE x, VALUE y)  
}

## -binop(xor, ‘^’)

fun1(abs)  
fun1(floor)  
-fun1(hash)  
fun1(inspect)  
fun1(integer\_p)  
@@ -1162,6 +1159,15 @@ static VALUE  
nurat\_hash(VALUE self)  
{

- long v, h[3];
- VALUE n;
- get\_dat1(self);

- return f\_xor(f\_hash(dat-\>num), f\_hash(dat-\>den));

- h[0] = rb\_hash(rb\_obj\_class(self));
- n = rb\_hash(dat-\>num);
- h[1] = NUM2LONG(n);
- n = rb\_hash(dat-\>den);
- h[2] = NUM2LONG(n);
- v = rb\_memhash(h, sizeof(h));
- return LONG2FIX(v);  
}

@@ -1555,5 +1561,4 @@ Init\_Rational(void)  
id\_expt = rb\_intern(“\*\*”);  
id\_floor = rb\_intern(“floor”);

- id\_hash = rb\_intern(“hash”);  
id\_idiv = rb\_intern(“div”);  
id\_inspect = rb\_intern(“inspect”);  
Index: string.c  
===================================================================  
— string.c (revision 21650)  
+++ string.c (working copy)  
@@ -1883,10 +1883,17 @@ rb\_str\_concat(VALUE str1, VALUE str2)

/\* MurmurHash described in [http://murmurhash.googlepages.com/](http://murmurhash.googlepages.com/) \*/  
-static unsigned int  
-hash(const unsigned char \* data, int len, unsigned int h)  
+static inline uint32\_t  
+murmur(unsigned int h, const int r)  
{  
const unsigned int m = 0x7fd652ad;

- const int r = 16;

- h \*= m;
- return h ^ (h \>\> r);  
+}
- 

+#define murmur16(h) murmur(h, 16)

+static unsigned int  
+hash(const unsigned char \* data, int len, unsigned int h)  
+{  
h += 0xdeadbeef;

@@ -1929,7 +1936,5 @@ hash(const unsigned char \* data, int len  
t = (t \>\> sr) | (d \<\< sl);  
#endif

- h += t;
- h \*= m;
- h ^= h \>\> r;

- h = murmur16(h + t);  
t = d;

@@ -1954,6 +1959,5 @@ hash(const unsigned char \* data, int len  
h += (t \>\> sr) | (d \<\< sl);  
#endif

- h \*= m;
- h ^= h \>\> r;

- h = murmur16(h);  
}

@@ -1965,8 +1969,5 @@ hash(const unsigned char \* data, int len  
{  
do {

- h += \*(uint32\_t \*)data;
- h \*= m;
- h ^= h \>\> r;
- 

- h = murmur16(h + \*(uint32\_t \*)data);  
data += 4;  
len -= 4;  
@@ -1991,18 +1992,57 @@ hash(const unsigned char \* data, int len  
h += data[0];  
#endif

- h \*= m;
- h ^= h \>\> r;

- h = murmur16(h);  
}

- h \*= m;
- h ^= h \>\> 10;
- h \*= m;
- h ^= h \>\> 17;

- return rb\_hash\_end(h);  
+}
- 

+unsigned int  
+rb\_hash\_uint32(unsigned int h, unsigned int i)  
+{

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

+unsigned int  
+rb\_hash\_uint(unsigned int h, unsigned int i)  
+{

- unsigned int v = 0;
- h += i;  
+#ifdef WORDS\_BIGENDIAN  
+#if SIZEOF\_INT_CHAR\_BIT \> 12_8
- v = murmur16(v + (h \>\> 12_8));  
+#endif  
+#if SIZEOF\_INT_CHAR\_BIT \> 8\*8
- v = murmur16(v + (h \>\> 8_8));  
+#endif  
+#if SIZEOF\_INT_CHAR\_BIT \> 4\*8
- v = murmur16(v + (h \>\> 4\*8));  
+#endif  
+#endif
- v = murmur16(v + h);  
+#ifndef WORDS\_BIGENDIAN  
+#if SIZEOF\_INT_CHAR\_BIT \> 4_8
- v = murmur16(v + (h \>\> 4_8));  
+#endif  
+#if SIZEOF\_INT_CHAR\_BIT \> 8\*8
- v = murmur16(v + (h \>\> 8_8));  
+#endif  
+#if SIZEOF\_INT_CHAR\_BIT \> 12\*8
- v = murmur16(v + (h \>\> 12\*8));  
+#endif  
+#endif
- return v;  
+}

+unsigned int  
+rb\_hash\_end(unsigned int h)  
+{

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

-int  
-rb\_memhash(const void \*ptr, long len)  
+unsigned int  
+rb\_hash\_start(unsigned int h)  
{  
static int hashseed\_init = 0;  
@@ -2013,6 +2053,11 @@ rb\_memhash(const void \*ptr, long len)  
hashseed\_init = 1;  
}

- return hashseed + h;  
+}

- return hash(ptr, len, hashseed);  
+int  
+rb\_memhash(const void \*ptr, long len)  
+{

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

# Index: struct.c

— struct.c (revision 21650)  
+++ struct.c (working copy)  
@@ -805,14 +805,15 @@ static VALUE  
rb\_struct\_hash(VALUE s)  
{

- long i, h;

- long i;
- unsigned h;  
VALUE n;

- h = rb\_hash(rb\_obj\_class(s));

- h = rb\_hash\_start(rb\_hash(rb\_obj\_class(s)));  
for (i = 0; i \< RSTRUCT\_LEN(s); i++) {

- h = (h \<\< 1) | (h\<0 ? 1 : 0);  
n = rb\_hash(RSTRUCT\_PTR(s)[i]);
- h ^= NUM2LONG(n);

- h = rb\_hash\_uint(h, NUM2LONG(n));  
}

- return LONG2FIX(h);

- h = rb\_hash\_end(h);
- return INT2FIX(h);  
}

# Index: time.c

— time.c (revision 21650)  
+++ time.c (working copy)  
@@ -1184,5 +1184,5 @@ time\_hash(VALUE time)

```
 GetTimeval(time, tobj);

```

- hash = tobj-\>ts.tv\_sec ^ tobj-\>ts.tv\_nsec;

- hash = rb\_hash\_end(rb\_hash\_uint(rb\_hash\_start(tobj-\>ts.tv\_sec),  
tobj-\>ts.tv\_nsec));  
return LONG2FIX(hash);  
}  
Index: include/ruby/intern.h  
===================================================================  
— include/ruby/intern.h (revision 21650)  
+++ include/ruby/intern.h (working copy)  
@@ -607,4 +607,8 @@ VALUE rb\_str\_append(VALUE, VALUE);  
VALUE rb\_str\_concat(VALUE, VALUE);  
int rb\_memhash(const void \*ptr, long len);  
+unsigned int rb\_hash\_start(unsigned int);  
+unsigned int rb\_hash\_uint32(unsigned int, unsigned int);  
+unsigned int rb\_hash\_uint(unsigned int, unsigned int);  
+unsigned int rb\_hash\_end(unsigned int);  
int rb\_str\_hash(VALUE);  
int rb\_str\_hash\_cmp(VALUE,VALUE);

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [January 19, 2009, 10:53am UTC](https://www.ruby-forum.com/t/string-hash/157891/6 "2009-01-19T10:53:58Z")

</div>

e$BKNIt$G$9!#e(B

Nobuyoshi N. e$B$5$s$O=q$-$^$7$?e(B:

> e$B$@$+$i$H$$$&$o$1$G$O$"$j$^$;$s$,!"e(BMurmurHash2.0e$B$H$$$&$b$N$,=P$Fe(B  
> e$B$$$?$N$G$=$A$i$K:9$7BX$($F$\_$^$7$?!#G\6a$/B.$/$J$k$h$&$G$9!#e(B

e$B$3$NJQ990J9\_e(Bamd64e$B$N%^%7%s$G%3%s%Q%$%k$,DL$j$^$;$s!#e(B

zsh % make up all  
make[1]: Entering directory `/home/shyouhei/build/trunk' /home/shyouhei/ruby/trunk/revision.h unchanged make[1]: Leaving directory`/home/shyouhei/build/trunk’  
gcc -pipe -ansi -std=iso9899:199409 -O2 -march=athlon64 -mcmodel=medium  
-g3  
-pedantic -Wall -Wextra -Wundef -Wno-format -Wno-long-long  
-Wno-parentheses  
-Wno-unused -Wno-sign-compare -Wno-missing-field-initializers -I.  
-I.ext/include/x86\_64-linux -I/home/shyouhei/ruby/trunk/include  
-I/home/shyouhei/ruby/trunk -DRUBY\_EXPORT -DRUBY\_DEBUG\_ENV  
-D\_FORTIFY\_SOURCE=2  
-o string.o -c /home/shyouhei/ruby/trunk/string.c  
/home/shyouhei/ruby/trunk/string.c: In function e$B!Fe(Bhashe$B!Ge(B:  
/home/shyouhei/ruby/trunk/string.c:1976: error: too few arguments to  
function  
e$B!Fe(Bmurmure$B!Ge(B  
make: \*\*\* [string.o] Error 1  
zsh: exit 2 make up all
