javascript - crypto.getRandomValues(new Uint32Array(1))[0]/lim 可以为负数吗?

标签 javascript node.js typescript cryptography cryptojs

好奇表达式 crypto.getRandomValues(new Uint32Array(1))[0]/lim 是否可以为负数。

我正在转换的代码在其周围放置了一个 Math.abs 包装器,但我们中的一些人认为它不可能为负数,所以只是想看看你们其他人的想法?

var lim = Math.pow(2, 32) - 1;
crypto.getRandomValues(new Uint32Array(1))[0] / lim);

这是更多上下文的相关问题: Converting getRandomValue.browser from cuid to Typescript?

该库有一个 getRandomValue() Nodejs 函数,如下所示:

import * as crypto from "crypto"

var lim = Math.pow(2, 32) - 1;

export function getRandomValue () {
  return Math.abs(crypto.randomBytes(4)
    .readInt32BE(0) / lim)
}

我认为对于浏览器来说,Math.abs 调用被保留,尽管看起来没有必要,而且很可能是不正确的。

最佳答案

在这种情况下,使用 Math.abs()错误!

正如上面的声明所述,所讨论的值是 UInt32 ...无符号 32 位整数。

这仅仅意味着最左边的位(最高有效位)被解释为符号位。但是,这并不能阻止您在某些情况下无意中使用该值,会假设 MSB=1 表示“负数”。

尽管如此,使用 abs()错误,因为如果发现 MSB=1,这会转换整个位模式,变成一个完全不同的位模式。由于 MSB 只是“组成该值的 32 位之一”,因此假设它是符号位,对其进行任何操作都是完全错误的。而且您还需要注意它永远不会显示为负数,因为它不是。这个数量是 32 位长,而不是 31+符号。确保它看起来总是这样。

关于javascript - crypto.getRandomValues(new Uint32Array(1))[0]/lim 可以为负数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60675465/

相关文章:

javascript - 如何将 Typescript 编译成使用 ES6 模块的 JS?

angular - 是否可以在 Angular 2中读取其他应用程序的本地存储?

javascript - $(window).resize() 在移动设备上滚动时执行

javascript - 如何在页面加载时单击按钮元素

php - 带有while循环的mysql Node js动态数组

javascript - Eclipse 打开声明错误 - 未解析为 Javascript 元素

javascript - Typescript - 数组到 block

javascript - 无法同时移动两个 Canvas 矩形

javascript - 修改 Cordova SQLite 插件

javascript - 链接 promise 强制异步