1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* hash.c (hash_i): return different values for inverse hash.

[ruby-core:34334]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@30514 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2011-01-11 23:37:15 +00:00
parent 5a17f4c4a3
commit 79654f3fd3
3 changed files with 19 additions and 3 deletions

View file

@ -1,3 +1,8 @@
Wed Jan 12 08:37:07 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
* hash.c (hash_i): return different values for inverse hash.
[ruby-core:34334]
Tue Jan 11 20:32:59 2011 Tanaka Akira <akr@fsij.org>
* variable.c: parenthesize macro arguments.

8
hash.c
View file

@ -1663,9 +1663,12 @@ static int
hash_i(VALUE key, VALUE val, VALUE arg)
{
st_index_t *hval = (st_index_t *)arg;
st_index_t hdata[2];
if (key == Qundef) return ST_CONTINUE;
*hval ^= rb_hash_end(rb_hash_uint(rb_hash_start(rb_hash(key)), rb_hash(val)));
hdata[0] = rb_hash(key);
hdata[1] = rb_hash(val);
*hval ^= st_hash(hdata, sizeof(hdata), 0);
return ST_CONTINUE;
}
@ -1678,9 +1681,10 @@ recursive_hash(VALUE hash, VALUE dummy, int recur)
return LONG2FIX(0);
hval = RHASH(hash)->ntbl->num_entries;
if (recur)
hval = rb_hash_end(rb_hash_uint(rb_hash_start(rb_hash(rb_cHash)), hval));
hval = rb_hash_uint(rb_hash_start(rb_hash(rb_cHash)), hval);
else
rb_hash_foreach(hash, hash_i, (VALUE)&hval);
hval = rb_hash_end(hval);
return INT2FIX(hval);
}

View file

@ -904,4 +904,11 @@ class TestHash < Test::Unit::TestCase
h.rehash
assert_equal(:foo, h[h])
end
def test_inverse_hash
feature4262 = '[ruby-core:34334]'
[{1=>2}, {123=>"abc"}].each do |h|
assert_not_equal(h.hash, h.invert.hash, feature4262)
end
end
end