ECMAScript 2020:BigInt 的作用与应用

ECMAScript 2020 (以下简称 ES2020)在 2020 年 6 月正式发布,其中引入了一个新的数据类型:BigInt。在本文中,我们将探讨 BigInt 的作用、应用以及使用方法。

BigInt 是什么?

BigInt 是 ES2020 引入的一个新的基本数据类型,可以表示超出 JavaScript 数值范围的整数。数字类型通常只能表示在 +/- 9007199254740991 之间的值,BigInt 则可以表示任意大的整数。

创建 BigInt 对象

BigInt 对象的创建方式很简单,只需要在整数后面加上 n 即可:

const bigIntNumber = 123456789012345678901234567890n;

在以上的例子中,我们创建了一个大整数常量,其值为 123456789012345678901234567890

BigInt 的用途

BigInt 在实际应用中有什么作用呢?常见的场景包括计算哈希值、生成随机数和执行加密算法等。

哈希计算

哈希计算中经常涉及到使用大整数,BigInt 可以很好地满足此类需求。以下示例演示了如何计算 SHA-256 的哈希值:

const crypto = require('crypto');
const msg = 'Hello World!';
const hash = crypto.createHash('sha256').update(msg).digest('hex');
const hashAsBigInt = BigInt('0x' + hash);

console.log(`Hash value: ${hashAsBigInt}`);

在以上代码中,我们使用 Node.js 内置的 crypto 模块计算哈希值,将其转换成 BigInt 对象并打印出来。

生成随机数

在某些场景中需要生成伪随机数,但基于 Math.random() 的解决方案可能过于简单或不够安全。以下示例演示了如何使用 BigInt 生成随机数:

function generateRandomNumber() {
  const maxNumber = 99999999999n;
  return BigInt(Math.floor(Math.random() * BigInt(Number(maxNumber)) + 1n));
}

console.log(generateRandomNumber());

在以上代码中,我们声明了一个函数来生成大整数随机数,并可以通过修改 maxNumber 变量的值来控制随机数的范围。

执行加密算法

BigInt 在执行一些加密算法中也非常实用。以下代码演示了如何使用 BigInt 加密解密字符串:

function encryptString(str) {
  const offset = 1024n;
  let encrypted = '';
  for (let i = 0; i < str.length; i++) {
    encrypted += (BigInt(str.charCodeAt(i)) + offset).toString(36) + '.';
  }
  return encrypted.slice(0, -1); 
}

function decryptString(str) {
  const offset = 1024n;
  let decrypted = '';
  const splitedString = str.split('.');
  for (let i = 0; i < splitedString.length; i++) {
    decrypted += String.fromCharCode(parseInt(BigInt(splitedString[i]), 36) - offset);
  }
  return decrypted;
}

const oriStr = 'Hello World!';
const encryptedStr = encryptString(oriStr);
console.log(encryptedStr);
console.log(decryptString(encryptedStr));

在以上代码中,我们声明了两个函数,一个用于加密字符串,另一个用于解密字符串。在加密过程中,将每个字符的 ASCII 码与一个偏移量相加后再进行 Base36 编码。在解密过程中,将字符串按照“.”进行分割,然后将 Base36 编码后的字符串转换为对应的 ASCII 码,最后再减去偏移量得到原字符。

建议

使用 BigInt 时需要注意以下几点:

  • 不要将 BigInt 作为普通数字使用,例如参与运算时,需要使用 BigInt 进行运算。
  • 在处理与普通数字混合计算的场景中,建议将所有数字转换为 BigInt,然后再执行计算。例如以下代码:
const a = 9999;
const b = BigInt(88888);

// 将普通数字转换为 BigInt 后再进行计算
const c = BigInt(a) + b;
console.log(c);
  • 不支持装箱,例如以下代码会抛出错误:
const bigIntNumber = new BigInt(123456789012345678901234567890);

总结

本文介绍了 ES2020 的 BigInt 数据类型,及其常见应用场景,例如哈希计算、生成伪随机数和执行加密算法等。例如在加密过程中,开发者可以使用 BigInt 等实现更为复杂的加密方案。在使用 BigInt 时需要遵循相关的注意事项,例如不要将 BigInt 作为普通数字使用,需要进行显式的类型转换等。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65accf52add4f0e0ff6615c5