Sau đây, chúng tôi sử dụng N4140 (Tiêu chuẩn C ++ 14).
Theo § 17.6.3.4 Yêu cầu băm ,
Giá trị được trả về sẽ chỉ phụ thuộc vào đối số
k
trong suốt thời gian của chương trình .[Lưu ý: Do đó, tất cả các đánh giá của biểu thức
h(k)
có cùng giá trị chok
kết quả giống nhau cho một lần thực hiện chương trình đã cho . - lưu ý cuối]
và § 20.9.12 Băm mẫu lớp nói
...
việc khởi tạo
hash<Key>
sẽ:(1.1) - đáp ứng các yêu cầu Hash (17.6.3.4) ...
(1.2) - ...
Điều này có nghĩa là giá trị băm của value
(nghĩa là hash<decltype(value)>(value)
) có thể lấy một giá trị khác nếu bạn khởi động lại chương trình.
Nhưng tại sao? Giới hạn này không nằm trong Tiêu chuẩn của C ++ 11, mà là trong Tiêu chuẩn của C ++ 14, C ++ 17 và C ++ 20. Là người dùng (không phải là nhà phát triển STL), nó sẽ khá hữu ích nếu mang tính std::hash
quyết định. Có bất kỳ khó khăn toán học trong việc thực hiện một hàm băm xác định? Nhưng các hàm băm mà chúng ta sử dụng hàng ngày (ví dụ như không dùng nữa md5sum
hoặc an toàn hơn sha256
) đều mang tính quyết định. Có một vấn đề về hiệu quả?