2017-11-22 9 views
-2

私はハッシュを浮動小数点数に変換しようとしてきましたが、これまでのところ数値を生成するだけでした。SHA256浮動小数点数

どのようにしてSHA256ハッシュを0.0から1.0の範囲の浮動小数点数に変換できますか?私は数を得た方法

、このような

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

これが可能かどうかわかりません。定義による浮動小数点数は、それがどのように格納されているかに関連して、ある程度の前兆を持っていなければなりません。たとえあなたがハッシュを変換することができたとしても、これはもう正確な表現ではない可能性があります。あなたが達成しようとしていることは何ですか? – roelofs

+0

@roelofs "imprecision" :-) --- OPへ:暗号StackExchangeフォーラムをチェックアウトすることができます(例:https://crypto.stackexchange.com/questions/17990/sha256-output-to-0-99- number-range –

+0

@Mörre - それは1つです - ありがとう!私は彼が何をしているのか分かりませんが、素晴らしいリンクです。理論的には、十分な大きさの仮数と指数で、彼は実際に大きな数字でハッシュを分割することができます... – roelofs

答えて

0

何か:この例では

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); 

、私は32個の数字のそれぞれに等しい重みを与える(合理的なようであるハッシュ以来実際には数字ではありません)。しかし、異なるバイトに異なる重みを付けることができます。例えば、最初のバイトには2^31、2番目のバイトには2^30などの重みを与え、それに応じて最終的な数を正規化することができます。

編集:一度に複数バイトの比較を行うこともできます。たとえば、2バイトからの16個の数字、またはそれぞれが4バイトからの8個の数字などです。「ユニット」サイズを増やすと、結果の最終数値は元のハッシュ値に「高い忠実度」を持ちます。

1

メレルのコメントには最高の答えが含まれています。単純にハッシュの最初の52ビット(またはハッシュの任意の便利な52ビット)を取り、それをjavascript番号に割り当てます。 52ビットの整数はIEEE 754の倍精度として正確に格納できます。次に、数字を単に2 で割ります。これは数字の指数ビットにのみ影響します。結果は浮動小数点数x、0 < = x < 1であり、制約を考えればできるだけ多くのエントロピーがある。