2017-11-22 4 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

이것이 가능한지 모르겠습니다. 정의에 의한 float은 저장 방법과 관련된 어느 정도의 unpreciseness (그것을 만들어야 만했습니다)를 가지고 있습니다. 해시를 변환 할 수 있다고하더라도 더 이상 정확한 표현이 아닐 가능성이 있습니다. 성취하려는 것은 무엇입니까? – roelofs

+0

@roelofs "imprecision":-) --- OP로 : 암호 StackExchange 포럼을 체크 아웃 할 수 있습니다 (예 : https://crypto.stackexchange.com/questions/17990/sha256-output-to-0-99- number-range –

+0

@ Mörre - 그 중 하나입니다 - 고마워요! 위대한 링크, 나는 그가 무엇을하는지 모르겠다. 이론상, 충분히 큰 가수와 지수로, 그는 해쉬를 실제로 큰 숫자로 나눌 수 있습니다 ... – 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^30 등의 가중치를 부여하고 이에 따라 최종 숫자를 정규화 할 수 있습니다.

편집 : 한 번에 여러 바이트의 비교를 수행 할 수도 있습니다. 예 : 2 바이트에서 오는 16 개의 숫자 또는 4 바이트에서 오는 8 개의 숫자 등. "단위"크기를 늘리면 최종 숫자는 원래의 해시 값에 대해 "높은 충실도"를 갖게됩니다.

1

뫼 르 (Möre)의 의견에 가장 적합한 대답이 들어 있습니다. 간단히 해시의 처음 52 비트 (또는 해시의 편리한 52 비트)를 가져 와서 자바 스크립트 번호에 할당하면됩니다. 52 비트 정수는 IEEE 754 이중으로 정확하게 저장할 수 있습니다. 그런 다음 단순히 숫자를 지수의 지수 비트에 영향을주는 2 으로 나눕니다. 결과는 부동 소수점 수 x, 0 < = x < 1이며, 주어진 제약 조건만큼 엔트로피가 있습니다.