2017-11-22 8 views
-2

Ich habe versucht, einen Hash in eine Float-Nummer zu konvertieren, bisher habe ich nur erreicht, um eine Zahl daraus zu generieren.SHA256 Hash zu float Nummer

Wie würde ich einen SHA256-Hash in eine Float-Zahl von 0,0 bis 1,0 konvertieren?

Wie ich eine Reihe bekam,

var hash = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'; 
var number = hash.substr(0, 8); 
number = parseInt(number, 16); 
number = Math.abs(number) % 11; 
console.log('Number (0 - 10): ' + number); 
+0

Ich weiß nicht, ob das möglich ist? Ein Float per definitionem hat ein gewisses Maß an Unpräzision (musste es aufstellen), wie es gespeichert ist. Selbst wenn Sie den Hashwert konvertieren könnten, ist es durchaus möglich, dass es keine genaue Darstellung mehr sein wird. Was versuchst du zu erreichen? – roelofs

+0

@roelofs "Ungenauigkeit" :-) --- Um zu OP: Sie könnten das crypto StackExchange Forum, zum Beispiel https://crypto.stackexchange.com/questions/17990/sha256-output-to-0-99- Nummernbereich –

+0

@ Mörre - das ist der eine - danke! Toller Link, obwohl ich nicht sicher bin, was er will. Theoretisch könnte er mit einer Mantisse und einem Exponenten, der groß genug ist, den Hash einfach durch eine wirklich große Zahl teilen ... – roelofs

Antwort

0

Etwas wie folgt aus:

var hash = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'; 
var number = 0.0; 
for(let i=0;i<hash.length;i++) { 
    number += parseInt(hash.charAt(i), 16)/16; 
} 
number /= hash.length; 
console.log('number = ' + number); 

In diesem Beispiel gebe ich das gleiche Gewicht auf jede der 32 Nummern (die seit einem Hash sinnvoll erscheint ist wirklich keine Nummer). Sie können jedoch verschiedenen Bytes unterschiedliche Gewichtungen zuweisen. Zum Beispiel können Sie dem ersten Byte ein Gewicht von 2^31 und dem zweiten Byte usw. 2^30 geben und die endgültige Zahl entsprechend normalisieren.

Edit: Sie können auch den Vergleich für mehrere Bytes gleichzeitig durchführen. Z. B. 16 Zahlen mit jeweils 2 Bytes oder 8 Zahlen mit jeweils 4 Bytes usw. Wenn Sie die "Einheit" -Größe erhöhen, hat die resultierende Endnummer eine "höhere Genauigkeit" gegenüber dem ursprünglichen Hash-Wert.

1

Der Kommentar von Mörre enthält die beste Antwort. Nehmen Sie einfach die ersten 52 Bits des Hash (oder beliebige 52 Bits des Hash) und weisen Sie sie einer Javascript-Nummer zu. Eine 52-Bit-Ganzzahl kann genau wie ein IEEE 754-Doppel gespeichert werden. Dann dividiere einfach die Zahl durch 2 , was nur die Exponentenbits der Zahl beeinflussen soll. Das Ergebnis ist eine Gleitkommazahl x, 0 < = x < 1, mit so viel Entropie, wie es bei den Randbedingungen möglich ist.