Array#hash bug?

Hi,
I was messing around with recursive arrays and I came across this:

mark@imac% cat hash.rb
a = []
a[0] = a
puts a.hash
mark@imac% ruby -v hash.rb
ruby 1.9.0 (2004-04-11) [powerpc-darwin]
hash.rb:3:in hash': stack level too deep (SystemStackError) from hash.rb:3:inhash’
from hash.rb:3:in hash' from hash.rb:3:inhash’
from hash.rb:3:in hash' from hash.rb:3:inhash’
from hash.rb:3:in hash' from hash.rb:3:inhash’
from hash.rb:3:in hash' ... 44888 levels... from hash.rb:3:inhash’
from hash.rb:3:in hash' from hash.rb:3:inhash’
from hash.rb:3

… looks like a bug?

cheers,
–Mark

You might count this as a bug, but it is documented.

In ToDo of ruby-1.8.1, there is this line:

  • hash etc. should handle self referenceing array/hash
···

On Wed, Apr 28, 2004 at 02:14:31AM +0900, Mark Hubbart wrote:

Hi,
I was messing around with recursive arrays and I came across this:

mark@imac% cat hash.rb
a =
a[0] = a
puts a.hash
mark@imac% ruby -v hash.rb
ruby 1.9.0 (2004-04-11) [powerpc-darwin]
hash.rb:3:in hash': stack level too deep (SystemStackError) from hash.rb:3:in hash’
from hash.rb:3:in hash' from hash.rb:3:in hash’
from hash.rb:3:in hash' from hash.rb:3:in hash’
from hash.rb:3:in hash' from hash.rb:3:in hash’
from hash.rb:3:in hash' ... 44888 levels... from hash.rb:3:in hash’
from hash.rb:3:in hash' from hash.rb:3:in hash’
from hash.rb:3

… looks like a bug?

cheers,
–Mark

ambrus

“Mark Hubbart” discord@mac.com schrieb im Newsbeitrag
news:56EB0554-986E-11D8-9038-000502FDD5CC@mac.com

Hi,
I was messing around with recursive arrays and I came across this:

mark@imac% cat hash.rb
a =
a[0] = a
puts a.hash
mark@imac% ruby -v hash.rb
ruby 1.9.0 (2004-04-11) [powerpc-darwin]
hash.rb:3:in hash': stack level too deep (SystemStackError) from hash.rb:3:in hash’
from hash.rb:3:in hash' from hash.rb:3:in hash’
from hash.rb:3:in hash' from hash.rb:3:in hash’
from hash.rb:3:in hash' from hash.rb:3:in hash’
from hash.rb:3:in hash' ... 44888 levels... from hash.rb:3:in hash’
from hash.rb:3:in hash' from hash.rb:3:in hash’
from hash.rb:3

… looks like a bug?

Hm, I’d say that for efficiency reasons loop detection in object graphs of
arrays is not done and thus it’s a bug you’ll have to live with. After
all, how often do you need self referencing containers?

robert

Apparently if I do need self referencing arrays, I can’t use #hash on
them. Unless I redefine it so it works properly.

Anyway, I realized that the documentation for Array#hash is messed up.
It claims (or at least implies) that #eql? uses #hash to compare
values. I was assuming that a bug in #hash would make comparisons mess
up. I was wrong :slight_smile:

irb(main):047:0> [1].eql? [2,1]
=> false
irb(main):048:0> [1].hash == [2,1].hash
=> true

hashes are definitely not unique :slight_smile:

–Mark

···

On Apr 28, 2004, at 1:04 AM, Robert Klemme wrote:

“Mark Hubbart” discord@mac.com schrieb im Newsbeitrag
news:56EB0554-986E-11D8-9038-000502FDD5CC@mac.com

Hi,
I was messing around with recursive arrays and I came across this:

mark@imac% cat hash.rb
a =
a[0] = a
puts a.hash
mark@imac% ruby -v hash.rb
ruby 1.9.0 (2004-04-11) [powerpc-darwin]
hash.rb:3:in hash': stack level too deep (SystemStackError) from hash.rb:3:in hash’
from hash.rb:3:in hash' from hash.rb:3:in hash’
from hash.rb:3:in hash' from hash.rb:3:in hash’
from hash.rb:3:in hash' from hash.rb:3:in hash’
from hash.rb:3:in hash' ... 44888 levels... from hash.rb:3:in hash’
from hash.rb:3:in hash' from hash.rb:3:in hash’
from hash.rb:3

… looks like a bug?

Hm, I’d say that for efficiency reasons loop detection in object
graphs of
arrays is not done and thus it’s a bug you’ll have to live with. After
all, how often do you need self referencing containers?

Which document did you read? ri says:

call-seq:
array.eql?(other) => true or false

Returns true if array and other are the same object,
or are both arrays with the same content.

Array#eql? does not use Array#hash at all for comparison. Hash
assumes hash values to be same when eql? is true (but not reverse).

						matz.
···

In message “Re: Array#hash bug?” on 04/04/28, Mark Hubbart discord@mac.com writes:

Anyway, I realized that the documentation for Array#hash is messed up.
It claims (or at least implies) that #eql? uses #hash to compare
values. I was assuming that a bug in #hash would make comparisons mess
up. I was wrong :slight_smile:

“Mark Hubbart” discord@mac.com schrieb im Newsbeitrag
news:DB14CDD9-98EE-11D8-9038-000502FDD5CC@mac.com

“Mark Hubbart” discord@mac.com schrieb im Newsbeitrag
news:56EB0554-986E-11D8-9038-000502FDD5CC@mac.com

Hi,
I was messing around with recursive arrays and I came across this:

mark@imac% cat hash.rb
a =
a[0] = a
puts a.hash
mark@imac% ruby -v hash.rb
ruby 1.9.0 (2004-04-11) [powerpc-darwin]
hash.rb:3:in hash': stack level too deep (SystemStackError) from hash.rb:3:in hash’
from hash.rb:3:in hash' from hash.rb:3:in hash’
from hash.rb:3:in hash' from hash.rb:3:in hash’
from hash.rb:3:in hash' from hash.rb:3:in hash’
from hash.rb:3:in hash' ... 44888 levels... from hash.rb:3:in hash’
from hash.rb:3:in hash' from hash.rb:3:in hash’
from hash.rb:3

… looks like a bug?

Hm, I’d say that for efficiency reasons loop detection in object
graphs of
arrays is not done and thus it’s a bug you’ll have to live with.
After
all, how often do you need self referencing containers?

Apparently if I do need self referencing arrays, I can’t use #hash on
them. Unless I redefine it so it works properly.

Yes. But do you need them? And if so, to which end?

Anyway, I realized that the documentation for Array#hash is messed up.
It claims (or at least implies) that #eql? uses #hash to compare
values. I was assuming that a bug in #hash would make comparisons mess
up. I was wrong :slight_smile:

irb(main):047:0> [1].eql? [2,1]
=> false
irb(main):048:0> [1].hash == [2,1].hash
=> true

hashes are definitely not unique :slight_smile:

That’s the nature of hash values. Always was. :slight_smile:

robert
···

On Apr 28, 2004, at 1:04 AM, Robert Klemme wrote:

I was just stupid :slight_smile: I misinterpreted the ri entry for Array#hash:

  Compute a hash-code for this array. Two arrays with the same
  content will have the same hash code (and will compare using
  +eql?+).

Actually, this entry is completely true, much to my surprise; I just
read it completely wrong. :confused:

–Mark

···

On Apr 28, 2004, at 2:01 AM, Yukihiro Matsumoto wrote:

In message “Re: Array#hash bug?” > on 04/04/28, Mark Hubbart discord@mac.com writes:

Anyway, I realized that the documentation for Array#hash is messed up.
It claims (or at least implies) that #eql? uses #hash to compare
values. I was assuming that a bug in #hash would make comparisons mess
up. I was wrong :slight_smile:

Which document did you read? ri says:

call-seq:
array.eql?(other) => true or false

Returns true if array and other are the same object,
or are both arrays with the same content.

Array#eql? does not use Array#hash at all for comparison. Hash
assumes hash values to be same when eql? is true (but not reverse).