好奇表达式 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/