【问题标题】:SHA256 Hash to float numberSHA256 哈希到浮点数
【发布时间】:2017-11-26 09:37:08
【问题描述】:

我一直在尝试将哈希转换为浮点数,到目前为止我只实现了从中生成一个数字。

如何将 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);

【问题讨论】:

  • 不知道这是否可行?根据定义,浮点数具有与它的存储方式相关的某种程度的不精确性(必须弥补)。即使您可以转换哈希,它也完全有可能不再是准确的表示。你想完成什么?
  • @roelofs "imprecision" :-) --- 致 OP:您可以查看加密 StackExchange 论坛,例如 crypto.stackexchange.com/questions/17990/…
  • @Mörre - 就是这样 - 谢谢!很好的链接,虽然我不确定他在追求什么。理论上,有了足够大的尾数和指数,他可以将哈希除以一个非常大的数字......
  • @Mörre 检查我编辑的代码,这就是我设法得到一个数字的方法,如果我能得到一个整数,我当然应该能够得到一个浮点数,或者..?
  • 您可以创建从 SHA256 的 256 位到 Javascript Number 的位的哈希,并使用 TypedArray 分配这些位。你肯定会丢失信息,因为 nr。 Number 中的位数要少得多!您也可以简单地使用每 4 位。实际上更多一点,因为这里只能使用 Javascript Number 中的一些 64 位。 -- 看看这个 JS 数字格式的解释:2ality.com/2012/04/number-encoding.html 或者只使用前 52 位,你扔掉 哪些 位无关紧要。

标签: javascript sha256 cryptojs


【解决方案1】:

类似这样的:

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 的权重,依此类推,并相应地对最终数字进行归一化。

编辑:您也可以一次比较多个字节。例如,16 个数字,每个数字来自 2 个字节,或 8 个数字,每个数字来自 4 个字节,等等。随着“单位”大小的增加,生成的最终数字将对原始哈希值具有“更高的保真度”。

【讨论】:

    【解决方案2】:

    Mörre 的评论包含最佳答案。只需取散列的前 52 位(或任何方便的 52 位散列)并将其分配给 javascript 数字。 52 位整数可以完全存储为 IEEE 754 双精度。然后只需将数字除以 252,这只会影响数字的指数位。结果是一个浮点数 x,0

    【讨论】:

      猜你喜欢
      • 2014-05-30
      • 1970-01-01
      • 2020-06-26
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2019-08-09
      • 1970-01-01
      相关资源
      最近更新 更多