奇怪的是,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调用是保留的,尽管它似乎没有必要,而且很可能是不正确的。
发布于 2020-03-13 19:00:09
在这种情况下,使用Math.abs()是错误的!
上述声明中提到的值是UInt32 .无符号32位整数。
这仅仅意味着最左边的位(最重要的位)不会被解释为符号位。然而,这并不妨碍您在假定MSB=1的意思为“否定”的某些上下文中无意中使用该值。
尽管如此,使用abs()是错误的,因为如果发现MSB=1,就会将整个位模式转换为完全不同的位模式。由于MSB只是“包含该值的32位中的一位”,对它做任何假设它是符号位的事情都是绝对错误的。你也要注意,它永远不会被显示为负数,因为它不是。这个数量是32位长,而不是31+sign。确保它看起来总是那样。
https://stackoverflow.com/questions/60675465
复制相似问题