首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Crypto.getRandomValues(新Uint32Array(1))[0] / lim是否为负值?

Crypto.getRandomValues(新Uint32Array(1))[0] / lim是否为负值?
EN

Stack Overflow用户
提问于 2020-03-13 18:20:28
回答 1查看 334关注 0票数 1

奇怪的是,crypto.getRandomValues(new Uint32Array(1))[0] / lim的表达是否可以是否定的。

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

代码语言:javascript
运行
复制
var lim = Math.pow(2, 32) - 1;
crypto.getRandomValues(new Uint32Array(1))[0] / lim);

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

库中有一个getRandomValue() nodejs函数,如下所示:

代码语言:javascript
运行
复制
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调用是保留的,尽管它似乎没有必要,而且很可能是不正确的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-13 19:00:09

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

上述声明中提到的值是UInt32 .无符号32位整数。

这仅仅意味着最左边的位(最重要的位)不会被解释为符号位。然而,这并不妨碍您在假定MSB=1的意思为“否定”的某些上下文中无意中使用该值。

尽管如此,使用abs()是错误的,因为如果发现MSB=1,就会将整个位模式转换为完全不同的位模式。由于MSB只是“包含该值的32位中的一位”,对它做任何假设它是符号位的事情都是绝对错误的。你也要注意,它永远不会被显示为负数,因为它不是。这个数量是32位长,而不是31+sign。确保它看起来总是那样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60675465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档