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ố
ktrong 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ị chokkế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::hashquyế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 md5sumhoặc an toàn hơn sha256) đều mang tính quyết định. Có một vấn đề về hiệu quả?