[前][次][番号順一覧][スレッド一覧]

ruby-changes:18491

From: nobu <ko1@a...>
Date: Wed, 12 Jan 2011 08:37:27 +0900 (JST)
Subject: [ruby-changes:18491] Ruby:r30514 (trunk): * hash.c (hash_i): return different values for inverse hash.

nobu	2011-01-12 08:37:15 +0900 (Wed, 12 Jan 2011)

  New Revision: 30514

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=30514

  Log:
    * hash.c (hash_i): return different values for inverse hash.
      [ruby-core:34334]

  Modified files:
    trunk/ChangeLog
    trunk/hash.c
    trunk/test/ruby/test_hash.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 30513)
+++ ChangeLog	(revision 30514)
@@ -1,3 +1,8 @@
+Wed Jan 12 08:37:07 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* hash.c (hash_i): return different values for inverse hash.
+	  [ruby-core:34334]
+
 Tue Jan 11 20:32:59 2011  Tanaka Akira  <akr@f...>
 
 	* variable.c: parenthesize macro arguments.
Index: hash.c
===================================================================
--- hash.c	(revision 30513)
+++ hash.c	(revision 30514)
@@ -1663,9 +1663,12 @@
 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 @@
         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);
 }
 
Index: test/ruby/test_hash.rb
===================================================================
--- test/ruby/test_hash.rb	(revision 30513)
+++ test/ruby/test_hash.rb	(revision 30514)
@@ -890,7 +890,7 @@
     assert_equal({x=>1}.hash, {x=>1}.hash)
 
     o = Object.new
-    def o.hash; 2<<100; end
+    def o.hash; 2 << 100; end
     assert_equal({x=>1}.hash, {x=>1}.hash)
   end
 
@@ -904,4 +904,11 @@
     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

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]