파이썬 용어집에서는 hashable는 용어를 다음과 같이 정의하고 있다.
수명 주기 동안 결코 변하지 않는 해시값을 갖고 있고 (
__hash__()메서드가 필요하다) 다른 객체와 비교할 수 있으면 (__eq__()메서드가 필요하다), 객체를 해시 가능하다고 한다. 동일하다고 판단되는 객체는 반드시 해시값이 동일해야 한다.
원자적 불변형(str, byte, 수치형)은 모두 해시 가능하다. frozenset은 언제나 해시 가능하다. 모든 요소가 해시 가능하도록 정의되어 있기 때문이다. 튜플은 들어 있는 항목들이 모두 해시 가능해야 해시 가능하다. 다음코드에서 tt, tl, tf 튜플을 보자.
>>> tt = (1, 2, (30, 40))
>>> hash(tt)
8091831283091283
>>> tl = (1, 2, [30, 40])
>>> hash(tl)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> tf = (1, 2, frozenset([30, 40]))
>>> hash(tf)
1894329893248023이때 튜플은 불변형이긴 하지만, 해시 불가능한 객체를 참조할 수 있다. 사용자 정의 자료형은 기본적으로 해시 가능하다. 기본적으로 객체의 해시값은 id()를 이용해서 구하므로 모든 객체가 서로 다르기 때문이다. 객체가 자신의 내부 상태를 평가해서 __eq__() 메서드를 직접 구현하는 경우에는 해시값 계산에 사용되는 속성이 모두 불변형일 때만 해시 가능하다.
