diff --git a/hash.c b/hash.c.new index ac0ebd7..e32aed3 100644 --- a/hash.c +++ b/hash.c.new @@ -122,10 +122,20 @@ rb_any_hash(VALUE a) } else if (BUILTIN_TYPE(a) == T_STRING) { hnum = rb_str_hash(a); - } - else { - hval = rb_hash(a); - hnum = FIX2LONG(hval); + } else { +#if SIZEOF_LONG_LONG == SIZEOF_VOIDP + if (BUILTIN_TYPE(a) == T_BIGNUM) { + int sign; + unsigned long ul; + sign = rb_integer_pack(a, &ul, 1, sizeof(ul), 0, + INTEGER_PACK_NATIVE_BYTE_ORDER); + ul &= (1UL << (sizeof(long)*CHAR_BIT-1)) - 1; + hnum = (sign < 0) ? LONG2FIX(-(long)ul) : LONG2FIX((long)ul); + } else { +#endif + hval = rb_hash(a); + hnum = FIX2LONG(hval); + } } hnum <<= 1; return (st_index_t)RSHIFT(hnum, 1);