티스토리 뷰

개발자노트

hash key에 대해서

앤디군 2005. 6. 6. 11:33
ruby에서 Hash key의 동일 조건은 다음과 같다.
a.eql?(b) && a.hash = b.hash


이 경우 a와 b는 Hash에서 같은 key로 간주된다.

하지만 key object의 상태에 따라 hash code나 eql? 조건이 달라진다면 key의 값이 달라져 나중에 해당 key로 value를 찾지 못하는 경우가 발생할 수 있다.

ex)

class HashKey
attr_accessor :value

def initialize(value)
@value = value
end

def hash
@value.hash
end

def eql?(object)
hash == object.hash
end
end

key1 = HashKey.new("key1")
hash = Hash.new
hash[key1] = "Hello"


puts hash[key1]
puts hash[HashKey.new("key1")]


실행 결과는 nil이다.
위의 예제를 보면 key1 object은 instance변수인 @value의 값에 따라 hash code가 변하게 된다. eql?역시 hash code의 값에 의존하여 결과가 달라진다.
key1 object에 "key1"의 문자열을 넣고 hash의 key로 사용한 후에 key1 object의 값을 바꾸게 되면 hash의 key가 같은 object를 참조하고 있기 때문에 hash내의 key 값도 바뀌게 된다. 때문에 HashKey.new("key1")하여 같은 내용의 object를 hash key로 사용하여 값을 꺼내올때 이미 들어가 있던 key object가 바뀌어있어서 값을 찾지 못하게 된다.
때문에, key로 사용될 object는 key로 사용한 이후에 값이 변하지 않도록 주의해야한다.

하지만 String객체는 hash key로 사용될 때 다른 object와는 다르게 처리된다. String의 경우 hash key로 할당되는 순간 객체를 복사하여 복사본이 hash key로 들어가게 된다. 그래서 hash key로 사용된 이후에도 문자열의 값이 변하더라도 hash key에는 영향을 끼치지 않는다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함