Hàm băm Python ()

Phương thức hash () trả về giá trị băm của một đối tượng nếu nó có một.

Giá trị băm chỉ là số nguyên được sử dụng để so sánh các khóa từ điển trong quá trình tra cứu từ điển một cách nhanh chóng.

Bên trong, hash()phương thức gọi __hash__()phương thức của một đối tượng được đặt theo mặc định cho bất kỳ đối tượng nào. Chúng ta sẽ xem xét điều này sau.

Cú pháp của hash()phương thức là:

 băm (đối tượng)

Tham số băm ()

hash() phương thức nhận một tham số duy nhất:

  • object - đối tượng có giá trị băm sẽ được trả về (số nguyên, chuỗi, số nổi)

Trả về giá trị từ hash ()

hash() phương thức trả về giá trị băm của một đối tượng nếu nó có một.

Nếu một đối tượng có __hash__()phương thức tùy chỉnh , nó sẽ cắt bớt giá trị trả về thành kích thước Py_ssize_t.

Ví dụ 1: Hàm băm () hoạt động như thế nào trong Python?

 # hash for integer unchanged print('Hash for 181 is:', hash(181)) # hash for decimal print('Hash for 181.23 is:',hash(181.23)) # hash for string print('Hash for Python is:', hash('Python'))

Đầu ra

 Hash cho 181 là: 181 Hash cho 181.23 là: 530343892119126197 Hash cho Python là: 2230730083538390373 

Ví dụ 2: hash () cho đối tượng tuple bất biến?

hash() phương thức chỉ hoạt động cho các đối tượng không thay đổi dưới dạng tuple.

 # tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))

Đầu ra

 Hàm băm là: -695778075465126279

Cách hash () hoạt động cho các đối tượng tùy chỉnh?

Như đã nêu ở trên, hash()phương thức gọi __hash__()phương thức nội bộ . Vì vậy, bất kỳ đối tượng nào cũng có thể ghi đè __hash__()cho các giá trị băm tùy chỉnh.

Nhưng để triển khai hàm băm chính xác, __hash__()phải luôn trả về một số nguyên. Và, cả hai __eq__()__hash__()phương pháp phải được thực hiện.

Dưới đây là các trường hợp __hash__()ghi đè chính xác .

Các trường hợp triển khai băm tùy chỉnh cho các đối tượng
__eq __ () __hash __ () Sự miêu tả
Được xác định (theo mặc định) Được xác định (theo mặc định) Nếu để nguyên, tất cả các đối tượng so sánh không bằng nhau (ngoại trừ chính chúng)
(Nếu có thể thay đổi) Không nên xác định Việc triển khai bộ sưu tập có thể băm yêu cầu giá trị băm của khóa phải không thay đổi
Không xác định Không nên xác định Nếu __eq__()không được xác định, __hash__()không nên xác định.
Xác định Không xác định Các cá thể lớp sẽ không thể sử dụng được dưới dạng bộ sưu tập có thể băm. __hash __ () được đặt thành None. Tăng TypeErrorngoại lệ nếu cố gắng truy xuất băm.
Xác định Giữ lại từ cha mẹ __hash__ = .__hash__
Xác định Không muốn băm __hash__ = None. Tăng ngoại lệ TypeError nếu cố gắng truy xuất băm.

Ví dụ 3: hash () cho Đối tượng tùy chỉnh bằng cách ghi đè __hash __ ()

 class Person: def __init__(self, age, name): self.age = age self.name = name def __eq__(self, other): return self.age == other.age and self.name == other.name def __hash__(self): print('The hash is:') return hash((self.age, self.name)) person = Person(23, 'Adam') print(hash(person))

Đầu ra

 Hàm băm là: 3785419240612877014

Lưu ý: Bạn không phải triển khai __eq__()phương thức cho băm vì nó được tạo theo mặc định cho tất cả các đối tượng.

thú vị bài viết...