Если вам интересно, я только что сделал хеш-функцию, которая использует плавающую точку и может хеш-плавающие. Он также проходит SMHasher (который является основным тестом смещения для некриптных хэш-функций). Это намного медленнее, чем обычные некриптографические хэш-функции из-за вычислений с плавающей запятой.
Я не уверен, что tifuhash станет полезным для всех приложений, но интересно, что простая функция с плавающей запятой проходит как PractRand, так и SMHasher.
Функция обновления основного состояния очень проста и выглядит следующим образом:
function q( state, val, numerator, denominator ) {
// Continued Fraction mixed with Egyptian fraction "Continued Egyptian Fraction"
// with denominator = val + pos / state[1]
state[0] += numerator / denominator;
state[0] = 1.0 / state[0];
// Standard Continued Fraction with a_i = val, b_i = (a_i-1) + i + 1
state[1] += val;
state[1] = numerator / state[1];
}
В любом случае, вы можете получить его по npm
Или вы можете проверить GitHub
Использование просто:
const tifu = require('tifuhash');
const message = 'The medium is the message.';
const number = 333333333;
const float = Math.PI;
console.log( tifu.hash( message ),
tifu.hash( number ),
tifu.hash( float ),
tifu.hash( ) );
Здесь есть демо-версия некоторых хэшей на runkit https://runkit.com/593a239c56ebfd0012d15fc9/593e4d7014d66100120ecdb9
Примечание: я думаю, что в будущем использование с плавающей запятой, возможно, больших массивов вычислений с плавающей запятой, может быть полезным способом создания в будущем более требовательных к вычислениям хеш-функций. Странный побочный эффект, который я обнаружил при использовании плавающей запятой, заключается в том, что хэши зависят от цели, и я предполагаю, что их можно использовать для идентификации платформ, на которых они были рассчитаны.