Se siete interessati, ho appena fatto una funzione di hash che usa in virgola mobile e in grado di hash galleggianti. Passa anche SMHasher (che è il test di bias principale per le funzioni hash non crittografiche). È molto più lento delle normali funzioni hash non crittografiche a causa dei calcoli float.
Non sono sicuro che se tifuhash diventerà utile per tutte le applicazioni, ma è interessante vedere una semplice funzione in virgola mobile passare sia PractRand che SMHasher.
La funzione di aggiornamento di stato principale è molto semplice, e si presenta come:
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];
}
In ogni caso, è possibile get it on npm Oppure si può check out the github
Utilizzando è semplice:
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());
C'è una demo di alcuni hash su runkit qui https://runkit.com/593a239c56ebfd0012d15fc9/593e4d7014d66100120ecdb9
Nota a margine: penso che in futuro l'utilizzo di virgola mobile, possibilmente di grandi matrici di calcoli in virgola mobile, potrebbe essere un modo utile per rendere più complicate le funzioni di hash in futuro. Uno strano effetto collaterale che ho scoperto di usare il floating point è che gli hash dipendono dall'obiettivo, e suppongo che potrebbero essere usati per impronte digitali delle piattaforme su cui sono stati calcolati.
Potresti spiegarci un po 'di più? "Il metodo solitamente per verificare l'uguaglianza fluttuante consiste nel verificare se rientra in qualche delta (in valore assoluto) della risposta corretta." – Pacane
+1 - La risposta non è di farlo in primo luogo. Non utilizzare i float come chiavi nelle mappe o nelle tabelle hash; prima o poi ti imbatterai in problemi. –
@Leo Davidson So che correrò nei guai, l'obiettivo di questo esercizio è quello di trovare esattamente quando ;-) – Pacane