Đối tượng hashable có giá trị hash không đổi suốt vòng đời, có phương thức __hash__() và có thể so sánh (__eq__()). Hashable objects có thể làm key của dict hoặc phần tử của set.
Đặc điểm
- Tất cả built-in immutable objects đều hashable: int, str, tuple, frozenset...
- Mutable containers (list, dict, set) không hashable.
- Instance của user-defined class: hashable mặc định (hash từ
id(), so sánh bằng identity). - Function objects cũng hashable (vì immutable sau khi tạo).
Ví dụ kiểm tra hash
m = lambda x: 1
print(hash(m)) # 1265925722
print(id(m)) # 3074942372 (khác hash)
print(m.__hash__()) # 1265925722
def f(): pass
print(type(f)) #
print(f.__hash__()) # 1265925978
print(hash(f)) # 1265925978
Giải thích
- Hash của function không nhất thiết bằng id() (xem ví dụ lambda).
- Hash được tính từ identity của function object, không đổi trong vòng đời.
- Hai function khác nhau (da khác code) có hash khác nhau.
- Cho phép dùng function làm key dict:
{my_func: "metadata"}.