Question très intéressante!
J'essaie de comprendre cela en tapant la réponse :) Tout d'abord, un moyen facile de jouer avec: 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
Pensons ensuite à ce que nous essayons de faire ici: Pour deux coordonnées d'entrée x, y nous retournons un "nombre aléatoire". Maintenant, ce n'est pas un nombre aléatoire. C'est la même chose chaque fois que nous saisissons le même x, y. C'est une fonction de hachage!
La première chose que fait la fonction est de passer de 2d à 1d. Ce n'est pas intéressant en soi, mais les nombres sont choisis pour ne pas se répéter typiquement. Nous avons également une addition en virgule flottante. Il y aura encore quelques bits de y ou de x, mais les nombres peuvent être choisis correctement pour faire un mélange.
Ensuite, nous échantillonnons une fonction de boîte noire sin (). Cela dépendra beaucoup de la mise en œuvre!
Enfin, il amplifie l'erreur dans l'implémentation de sin () en multipliant et en prenant la fraction.
Je ne pense pas que ce soit une bonne fonction de hachage dans le cas général. Le sin () est une boîte noire, sur le GPU, numériquement. Il devrait être possible d'en construire une bien meilleure en prenant presque toutes les fonctions de hachage et en les convertissant. Le plus dur est de transformer l'opération d'entier typique utilisée dans le hachage du processeur en opérations flottantes (demi ou 32 bits) ou en virgule fixe, mais cela devrait être possible.
Encore une fois, le vrai problème avec cela en tant que fonction de hachage est que sin () est une boîte noire.