Hi -- On Wed, 23 Nov 2005, Steven Arnold wrote: > I've seen several posts related in some way to the subject of using > hashes as keys in hashes, but I haven't seen a clear solution to the > issue. My problem is I want to generate a set of unique hashes. > Since hash keys are unique, I was hoping to just put the hashes in > as keys, something like: > > myUniqueHashes[aHash] ||= 0 > myUniqueHashes[aHash] += 1 > > This would not only give me a list of unique hashes, but it would > also tell me how many times each one was seen. > > Unfortunately, this does not work because in a hash, each different > hash that is inserted as a key is considered to be different, even > if the contents are the same. When used as keys in a hash, two > hashes are considered equal if aHash.id = bHash.id, meaning if they > are the very same hash located at the same place in memory. > > At the micro level, what I need is a special kind of hash that will > consider two hash keys to be equal if aHash == bHash. At a higher > level, I need an efficient way to collect a unique set of hashes. > An array would work, but for a large set it'd be much slower....and > storing the number of accesses would be relatively clunky compared > to a hash's interface. > > What is the Ruby way to solve this problem? You could define an appropriate default behavior for the hash of hashes: unique_hashes = Hash.new do |hash,key| existing = hash.keys.find {|k| k == key } if existing hash[existing] += 1 else hash[key] = 1 end end a = {"a","b"} b = {"a","b"} unique_hashes[a] unique_hashes[b] unique_hashes[{"some","other"}] p unique_hashes # {{"some"=>"other"}=>1, {"a"=>"b"}=>2} David -- David A. Black dblack / wobblini.net