# Hash & keys

**URL:** <https://www.ruby-forum.com/t/hash-keys/71982>\
**Category:** Ruby\
**Created:** [October 13, 2006, 2:05am UTC](https://www.ruby-forum.com/t/hash-keys/71982 "2006-10-13T02:05:57Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![sebw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e56c9b/32.png) [@sebw](https://www.ruby-forum.com/u/sebw)\
**Post date:** [October 13, 2006, 2:05am UTC](https://www.ruby-forum.com/t/hash-keys/71982/1 "2006-10-13T02:05:57Z")

</div>

I’m having some trouble understanding how hashes work in Ruby. Consider  
the following test :

irb(main):002:0\> v=Vector[4,5]  
=\> Vector[4, 5]  
irb(main):003:0\> v2=Vector[4,5]  
=\> Vector[4, 5]  
irb(main):004:0\> v==v2  
=\> true  
irb(main):005:0\> v.hash  
=\> 17  
irb(main):006:0\> v2.hash  
=\> 17  
irb(main):007:0\> h=Hash.new  
=\> {}  
irb(main):008:0\> h[v]=“whatever is in (4,5)”  
=\> “whatever is in (4,5)”  
irb(main):009:0\> h[v2]  
=\> nil

I’d have expected h[v2] =\> “whatever is in (4,5)”, since v==v2 and both  
have the same hash value… what am I doing wrong?

---

<div class="post-metadata">

**Author:** ![sebw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e56c9b/32.png) [@sebw](https://www.ruby-forum.com/u/sebw)\
**Post date:** [October 13, 2006, 2:28am UTC](https://www.ruby-forum.com/t/hash-keys/71982/2 "2006-10-13T02:28:20Z")

</div>

SÃ©bastien Wautelet wrote:

> I’d have expected h[v2] =\> “whatever is in (4,5)”, since v==v2 and both  
> have the same hash value… what am I doing wrong?

Hash keys can be any object. So your hash, h, has one key, the object v.

Take another hash real quick, we’ll call it hash.

hash = Hash.new

hash[‘rabbit’] = ‘cute’ # ‘cute’  
hash[‘blue’] # nil

The value for any hash key not defined is nil (unless you explicitly  
tell the hash during instantiation to use another value).

So just because you’re using the value of v as a key in your hash, does  
not mean that v2 is automatically another key in your hash.

---

<div class="post-metadata">

**Author:** ![sebw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e56c9b/32.png) [@sebw](https://www.ruby-forum.com/u/sebw)\
**Post date:** [October 13, 2006, 2:36am UTC](https://www.ruby-forum.com/t/hash-keys/71982/3 "2006-10-13T02:36:02Z")

</div>

I think you’re getting hung up on this part:

SÃ©bastien Wautelet wrote:

> irb(main):004:0\> v==v2  
> =\> true

Yes, v and v2 are equal. But that is irrelevant with regards to your  
hash.

Now, if you had to objects that were identical (not equal, but  
identical) then it would work:

s1 = ‘string’  
s2 = s1

h = Hash.new

h[s1] # ‘string’  
h[s2] # ‘string’

s1.upcase!

h[s2] # ‘STRING’  
h[s1] # ‘STRING’

Hope that helps.

---

<div class="post-metadata">

**Author:** ![sebw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e56c9b/32.png) [@sebw](https://www.ruby-forum.com/u/sebw)\
**Post date:** [October 18, 2006, 10:39am UTC](https://www.ruby-forum.com/t/hash-keys/71982/4 "2006-10-18T10:39:55Z")

</div>

Timothy H. wrote:

> > irb(main):005:0\> v.hash  
> > I’d have expected h[v2] =\> “whatever is in (4,5)”, since v==v2 and  
> > both have the same hash value… what am I doing wrong?
> 
> It’s not enough that they have the same hash value or that obj1 ==  
> obj2. For the purposes of Hash, two objects are the same if  
> obj1.eql?(obj2). Does v1.eql?(v2)?

Testing reveals that they don’t. but that strikes me as a bug in the  
Vector class. It violates the guidelines given in the PickAxe book  
(bottom of page 568), and more importantly, it violates common  
intuition. If two vectors that are created in exactly the same manner  
aren’t eql?, they’re useless for use as hash keys. I’d say file a bug  
report, or at least a problem, on this one.

Cheers,  
Ken

---

<div class="post-metadata">

**Author:** ![sebw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e56c9b/32.png) [@sebw](https://www.ruby-forum.com/u/sebw)\
**Post date:** [October 18, 2006, 10:39am UTC](https://www.ruby-forum.com/t/hash-keys/71982/5 "2006-10-18T10:39:36Z")

</div>

SÃ©bastien Wautelet wrote:

> =\> 17  
> have the same hash value… what am I doing wrong?

It’s not enough that they have the same hash value or that obj1 == obj2.  
For the purposes of Hash, two objects are the same if obj1.eql?(obj2).  
Does v1.eql?(v2)?

---

<div class="post-metadata">

**Author:** ![sebw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e56c9b/32.png) [@sebw](https://www.ruby-forum.com/u/sebw)\
**Post date:** [October 18, 2006, 10:39am UTC](https://www.ruby-forum.com/t/hash-keys/71982/6 "2006-10-18T10:39:59Z")

</div>

Daniel W. wrote:

> identical) then it would work:  
> I think it is relevant, given that the Vector class is designed to be  
> immutable. I would agree that the Vector class should probably define  
> #eql? as an alias for #==.

---

<div class="post-metadata">

**Author:** ![sebw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e56c9b/32.png) [@sebw](https://www.ruby-forum.com/u/sebw)\
**Post date:** [October 18, 2006, 10:44am UTC](https://www.ruby-forum.com/t/hash-keys/71982/7 "2006-10-18T10:44:00Z")

</div>

On 10/13/06, Phrogz [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> I think it is relevant, given that the Vector class is designed to be  
> immutable. I would agree that the Vector class should probably define  
> #eql? as an alias for #==.

It appears to be a typo in Matrix.rb - This is in ruby1.8.4:

class Vector  
…

# 

# Returns +true+ iff the two vectors have the same elements in the

same order.

# 

def ==(other)  
return false unless Vector === other

```
other.compare_by(@elements)

```

end  
alias eqn? ==  
~~~

And Vector seems to be the only implementor of eqn?

## rick@frodo:~/ruby-1.8.4$ ri eqn ------------------------------------------------------------ Vector#eqn? eqn?(other)

```
 Alias for #==

```

And it’s not yet fixed in 1.9  
rick@frodo:~/ruby-1.8.4$ grep eqn  
/public/rubysource/ruby1.9/ruby/lib/matrix.rb  
alias eqn? ==

–  
Rick DeNatale

My blog on Ruby  
[http://talklikeaduck.denhaven2.com/](http://talklikeaduck.denhaven2.com/)
