Hầu hết các câu trả lời cho thấy điều này là do các nền tảng khác nhau, nhưng có nhiều hơn thế. Từ tài liệu củaobject.__hash__(self)
:
Theo mặc định, __hash__()
giá trị của str
, bytes
và
datetime
đối tượng được “mặn” với một giá trị ngẫu nhiên không thể đoán trước. Mặc dù chúng không đổi trong một quy trình Python riêng lẻ, chúng không thể dự đoán được giữa các lần gọi Python lặp lại.
Điều này nhằm cung cấp sự bảo vệ chống lại sự từ chối dịch vụ gây ra bởi các đầu vào được lựa chọn cẩn thận khai thác hiệu suất trong trường hợp xấu nhất của việc chèn chính tả, độ phức tạp O (n²). Xem
http://www.ocert.org/advisories/ocert-2011-003.html để biết thêm chi tiết.
Thay đổi giá trị băm ảnh hưởng đến trật tự lặp của dicts
, sets
và ánh xạ khác. Python chưa bao giờ đảm bảo về thứ tự này (và nó thường thay đổi giữa các bản dựng 32 bit và 64 bit).
Ngay cả khi chạy trên cùng một máy cũng sẽ mang lại các kết quả khác nhau giữa các lệnh gọi:
$ python -c "print(hash('http://stackoverflow.com'))"
-3455286212422042986
$ python -c "print(hash('http://stackoverflow.com'))"
-6940441840934557333
Trong khi:
$ python -c "print(hash((1,2,3)))"
2528502973977326415
$ python -c "print(hash((1,2,3)))"
2528502973977326415
Xem thêm biến môi trường PYTHONHASHSEED
:
Nếu biến này không được thiết lập hoặc thiết lập để random
một giá trị ngẫu nhiên được sử dụng để gieo rắc sự băm của str
, bytes
và datetime
các đối tượng.
Nếu PYTHONHASHSEED
được đặt thành một giá trị số nguyên, nó được sử dụng như một hạt giống cố định để tạo ra hash()
các loại được bao phủ bởi ngẫu nhiên hóa băm.
Mục đích của nó là cho phép băm có thể lặp lại, chẳng hạn như cho các phép chọn lọc cho chính trình thông dịch hoặc cho phép một nhóm các quy trình python chia sẻ các giá trị băm.
Số nguyên phải là số thập phân trong phạm vi [0, 4294967295]
. Chỉ định giá trị 0
sẽ vô hiệu hóa ngẫu nhiên hóa băm.
Ví dụ:
$ export PYTHONHASHSEED=0
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305