【问题标题】:How to generate a Random token of 32 bit in Javascript?如何在 Javascript 中生成 32 位的随机令牌?
【发布时间】:2016-05-22 18:47:14
【问题描述】:

我需要在 JavaScript 中生成一个准确的 32 位随机字母数字字符串。
有什么直接的函数可以做到吗?

【问题讨论】:

  • “准确”是什么意思?
  • 你的意思是32个字符吗?
  • 大小应该是32位的,我需要做一个Hash。
  • 另外,32 位字母数字字符串是什么意思?什么编码?传统上不以位为单位测量字符串长度。
  • @NickBailey,这很困难。我被要求采用随机的 32 位字符串。不是 32 个字符。

标签: javascript


【解决方案1】:

使用cryptotyped array

function random32bit() {
    let u = new Uint32Array(1);
    window.crypto.getRandomValues(u);
    let str = u[0].toString(16).toUpperCase();
    return '00000000'.slice(str.length) + str;
}

这为我们提供了一个 32 位加密随机数,表示为 8 个字符的零填充字符串(以 16 为基数)


如果您想将此扩展到任意数量的字符;

function randomHash(nChar) {
    let nBytes = Math.ceil(nChar = (+nChar || 8) / 2);
    let u = new Uint8Array(nBytes);
    window.crypto.getRandomValues(u);
    let zpad = str => '00'.slice(str.length) + str;
    let a = Array.prototype.map.call(u, x => zpad(x.toString(16)));
    let str = a.join('').toUpperCase();
    if (nChar % 2) str = str.slice(1);
    return str;
}

在 ES5 中,使用 cmets

function randomHash(nChar) {
    // convert number of characters to number of bytes
    var nBytes = Math.ceil(nChar = (+nChar || 8) / 2);

    // create a typed array of that many bytes
    var u = new Uint8Array(nBytes);

    // populate it wit crypto-random values
    window.crypto.getRandomValues(u);

    // convert it to an Array of Strings (e.g. "01", "AF", ..)
    var zpad = function (str) {
        return '00'.slice(str.length) + str
    };
    var a = Array.prototype.map.call(u, function (x) {
        return zpad(x.toString(16))
    });

    // Array of String to String
    var str = a.join('').toUpperCase();
    // and snip off the excess digit if we want an odd number
    if (nChar % 2) str = str.slice(1);

    // return what we made
    return str;
}

【讨论】:

  • “这给了我们一个 32 位的加密随机数” 第一个例子会返回 64 位吗?
  • @guest271314 我写了一个方法,它可以让你生成 4 位的任意倍数 :) 另外,我看不出你认为我的第一个代码块中的 64 位值来自哪里- 它使用Uint32Array
  • 是 JS 吗?它给出了缺少分号的语法错误
  • @Rahul 这是 ES6,如果你想要 ES5,那么你只需要用老式的方式编写两个箭头函数作为函数表达式
  • @PaulS。谢谢你的支持,但是你能不能给我提供 ES5 的功能,因为我很难理解。谢谢。
【解决方案2】:

我需要生成一个准确的 32 位随机字母数字字符串 JavaScript。

如果你的意思是 32 个字符,你可以使用URL.createObjectURLString.prototype.slice()String.prototype.replace()

var rand = URL.createObjectURL(new Blob([])).slice(-36).replace(/-/g, "")

【讨论】:

  • JS中一个字符的大小是多少?
  • @Rahul “大小”是什么意思?
  • 谢谢。我正在尝试提供的答案。很快就会回复@guest271314 谢谢你的链接。
  • @Rahul 由于 4 字节相当于 32 位,因此您删除了 .replace(),请使用 -4 .slice() var rand = URL.createObjectURL(new Blob([])).slice(-4) jsfiddle.net/91hb2n7k/1
【解决方案3】:

灵感来自Paul S.'s answer,但更简单一些:

const Token = () => {
  const array = new Uint32Array(1)
  window.crypto.getRandomValues(array)
  return array[0].toString(36)
}

【讨论】:

    【解决方案4】:

    你可以使用这个功能:

    function returnHash(){
        abc = "abcdefghijklmnopqrstuvwxyz1234567890".split("");
        var token=""; 
        for(i=0;i<32;i++){
             token += abc[Math.floor(Math.random()*abc.length)];
        }
        return token; //Will return a 32 bit "hash"
    }
    

    拨打returnHash()使用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 2016-01-24
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      相关资源
      最近更新 更多