If you put K.new into a variable, and then check for that, it will 
return true:

irb(main):001:0> class K; def hash; 90; end; end
=> nil
irb(main):002:0> h = {}
=> {}
irb(main):003:0> k = K.new
=> #<K:0xb7cac4ac>
irb(main):004:0> h[k] = 1
=> 1
irb(main):005:0> h[k]
=> 1
irb(main):006:0> h.key? k
=> true

It's because K.new creates a new location in memory for each call to it, 
but h.key? checks the location in memory, not the contents of the keys 
and the objects passed to it.  So if you call K.new twice, each will 
return a new location in memory.

Dan


Suraj Kurapati wrote:
> Hello,
> 
> I'm trying to make two keys equivalent by having their #hash method
> produce the same result. But this does not seem to work:
> 
> irb(main):001:0> class K; def hash; 90; end; end
> => nil
> irb(main):002:0> h = {}
> => {}
> irb(main):003:0> h[K.new] = 1
> => 1
> irb(main):004:0> h.key? K.new      # <---- I want this to return true!
> => false
> 
> What am I missing?
> 
> Thanks for your consideration.
>