前端 JS生成32位UUID (安全的随机数)

本文讨论了JavaScript中`Math.random()`生成伪随机数的局限性,推荐在安全性要求高的场景下使用`window.crypto.getRandomValues()`。文章还介绍了如何在考虑浏览器兼容性的前提下,生成不同长度的随机数和UUID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaScript的`Math.random()`实现PRNG(伪随机数序列发生器),该PRNG是可移植和可重复的,因此如果两个`Math.random()`使用相同的种子,会生成相同的数值序列。

例如:下面的代码使用Math.random()

//创建的Token很容易被猜到。
function getToken (){
var token =
Math.random();
return token;
}
`

JavaScript在安全性要求较高的环境中生成随机数,常规的建议是使用 Mozilla API 中的`window.crypto.getRandomValues()`函数,但这种方法受限于浏览器的兼容性,只在较新的版本(Chrome>=11.0, Firefox>=21, Edge, IE>=11, Safari>=3.1)可以使用。如果考虑到旧版本浏览器,则应在javascript之外处理PRNG功能。

/**
 * @description: 生成随机数0-255
 * @param {num} 最大值
 */
export const random8bitValue = (num) => {
  // 创建一个长度为1的Uint8Array类型数组
  let randomValues = new Uint8Array(1);
  // 使用window.crypto.getRandomValues()方法填充数组
  window.crypto.getRandomValues(randomValues);
  // 获取0到num的随机整数
  let randomInteger = num ? randomValues[0] % num : randomValues[0];
  return randomInteger;
};

/**
 * @description: 生成随机数0-4294967295(2^32-1)
 * @param {num} 最大值
 */
export const random32bitValue = (num) => {
  // 创建一个长度为1的Uint8Array类型数组
  let randomValues = new Uint32Array(1);
  // 使用window.crypto.getRandomValues()方法填充数组
  window.crypto.getRandomValues(randomValues);
  // 获取0到num的随机整数
  let randomInteger = num ? randomValues[0] % num : randomValues[0];
  return randomInteger;
};

/**
 * @description: 生成32位 uuid 8-4-4-4-12的格式
 */
export const generateUUID = () => {
  let data = new Uint8Array(16);
  window.crypto.getRandomValues(data);
  let uuid = Array.from(data)
    .map((byte) => byte.toString(16).padStart(2, "0"))
    .join("");
  // 切割 8-4-4-4-12的格式
  return (
    uuid.slice(0, 8) +
    "-" +
    uuid.slice(8, 12) +
    "-" +
    uuid.slice(12, 16) +
    "-" +
    uuid.slice(16, 20) +
    "-" +
    uuid.slice(20)
  );
};

/**
 * @description: 生成32位  a52d50373c9543fe9845821a1b1cfc00
 */
export const generateUUID2 = () => {
 let uuid = Array.prototype.map.call(window.crypto.getRandomValues(new Uint8Array(16)), (item) => item.toString(16)).join("");
if (uuid.length < 32) {
  uuid += "0".repeat(32 - uuid.length); // 添加0补足位数
}
return uuid;

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值