>>>>> "Y" == Yukihiro Matsumoto <matz / netlab.co.jp> writes: Y> Hmm, the only requirement for `hash' method is Y> * a.hash == b.hash where a.eql?(b) is true. I've not understood, sorry. Do you mean 1) if a.eql?(b) then a.hash == b.hash or 2) if a.hash == b.hash then a.eql?(b) is true Y> So I guess your expectation may be too much. Y> BTW, My second option was broken for arrays with string elements. Y> How about like below? Y> def hash Y> h = self.id Y> for item in self Y> if item.kind_of? Array Y> h ^= item.id Y> else Y> h ^= item.hash Y> end Y> end Y> h Y> end This don't work for the first case with [1, 2, [1, 2]] and [1, 2, [1, 2]] a.hash != b.hash and a.eql?(b) is true p.s. : I've not understood the interest to have a recursive array. Guy Decoux