Câu hỏi rất thú vị!
Tôi đang cố gắng tìm ra điều này trong khi nhập câu trả lời :) Đầu tiên, một cách dễ dàng để chơi với nó: http://www.wolframalpha.com/input/?i=plot%28+mod%28+sin%28x*12.9898 +% 2B + y * 78,233% 29 + * + 43758,5453% 2C1% 29x% 3D0..2% 2C + y% 3D0..2% 29
Sau đó, hãy nghĩ về những gì chúng tôi đang cố gắng làm ở đây: Đối với hai tọa độ đầu vào x, y, chúng tôi trả về một "số ngẫu nhiên". Bây giờ đây không phải là một con số ngẫu nhiên. Nó giống nhau mỗi khi chúng ta nhập cùng một x, y. Đó là một hàm băm!
Điều đầu tiên hàm làm là chuyển từ 2d đến 1d. Bản thân điều đó không thú vị, nhưng các con số được chọn để chúng không lặp lại một cách điển hình. Ngoài ra, chúng tôi có một bổ sung dấu chấm động ở đó. Sẽ có thêm một vài bit từ y hoặc x, nhưng các số có thể được chọn đúng để nó có sự kết hợp.
Sau đó, chúng tôi lấy mẫu một hàm sin () hộp đen. Điều này sẽ phụ thuộc rất nhiều vào việc thực hiện!
Cuối cùng, nó khuếch đại lỗi trong việc triển khai sin () bằng cách nhân và lấy phân số.
Tôi không nghĩ rằng đây là một hàm băm tốt trong trường hợp chung. Sin () là một hộp đen, trên GPU, về số. Có thể tạo một hàm tốt hơn nhiều bằng cách sử dụng hầu hết mọi hàm băm và chuyển đổi nó. Phần khó là biến phép toán số nguyên điển hình được sử dụng trong băm cpu thành phép toán float (một nửa hoặc 32bit) hoặc điểm cố định, nhưng nó sẽ hoàn toàn khả thi.
Một lần nữa, vấn đề thực sự với điều này như một hàm băm là sin () là một hộp đen.