Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于用户详细信息在Javascript中创建随机令牌_Javascript_Jquery_Random_Token - Fatal编程技术网

基于用户详细信息在Javascript中创建随机令牌

基于用户详细信息在Javascript中创建随机令牌,javascript,jquery,random,token,Javascript,Jquery,Random,Token,我想创建一个随机字符串(令牌),它可以用来识别用户,同时避免与任何其他用户的令牌发生任何潜在冲突 我想到的是一个MD5哈希值navigator.userAgent+new Date().getTime(),以生成令牌,但这需要一个完整的Javascript MD5库来对其进行哈希,我并不想这样做 它必须由A-Z/0-9个字符组成,最好不超过32个字符。我对所有的想法都持开放态度。谢谢 我只是想澄清一下,我不是在寻找任何随机字符串生成器,随机字符串必须根据Javascript提供的用户详细信息生成

我想创建一个随机字符串(令牌),它可以用来识别用户,同时避免与任何其他用户的令牌发生任何潜在冲突

我想到的是一个MD5哈希值
navigator.userAgent+new Date().getTime()
,以生成令牌,但这需要一个完整的Javascript MD5库来对其进行哈希,我并不想这样做

它必须由A-Z/0-9个字符组成,最好不超过32个字符。我对所有的想法都持开放态度。谢谢


我只是想澄清一下,我不是在寻找任何随机字符串生成器,随机字符串必须根据Javascript提供的用户详细信息生成,还可以利用时间避免潜在冲突

您可以生成一个随机数并将其转换为基数36(
0-9a-z
):


结帐项目。它是密码算法的集合。对于每个哈希算法,项目都有单独的js文件。

此函数允许您设置令牌长度和允许的字符

function generate_token(length){
    //edit the token allowed characters
    var a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".split("");
    var b = [];  
    for (var i=0; i<length; i++) {
        var j = (Math.random() * (a.length-1)).toFixed(0);
        b[i] = a[j];
    }
    return b.join("");
}

我使用的方法与类似,但函数调用和内置数组操作较少,从而大大提高了性能

根据a,这种方法也比公认的答案有小幅度的优势。此外,它还提供了一个参数
n
,用于从可接受字符的白名单生成任意大小的标记长度。它很灵活,性能也很好

function generateToken(n) {
    var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    var token = '';
    for(var i = 0; i < n; i++) {
        token += chars[Math.floor(Math.random() * chars.length)];
    }
    return token;
}
function generateToken(n){
var chars='ABCDEFGHIjklmnopqrstuvxyzabCDEFGHIjklmnopqrstuvxyz012456789';
var标记=“”;
对于(变量i=0;i
可能性不大,但Math.random()可能返回
0.0
。在这种情况下,的解决方案将返回
(空字符串)。因此,这里是另一个解决方案,它在每种情况下都返回一个长度为10个字符的随机base36:

function generateToken() {
    Math.floor(1000000000000000 + Math.random() * 9000000000000000)
          .toString(36).substr(0, 10)
}
//长度:定义要在字符串中表示的字符长度
常量rand=()=>Math.random(0)、toString(36)、substr(2);
常量标记=(长度)=>(rand()+rand()+rand()+rand()).substr(0,长度);
控制台日志(令牌(40));
//示例1:令牌(10)=>结果:tsywlmdqu6

//示例2:令牌(40)=>结果:m4vni14mtln2547gy54ksclhcv0dj6tp9fhs1k10
@fire:我认为这实际上不会导致冲突。从理论上讲,MD5也会导致冲突,但你不必担心。如果令牌是通过某人自己的浏览器信息+你的方法生成的,那么它可能会发生冲突。@fire:我不完全明白你的意思
navigator.userAgent
并非对每个人都是唯一的,因此它不能防弹。从
中删除
radix
36
)参数。在
rand
函数中,toString
将只给你数字哈希值——如果有人喜欢这样的哈希值:
返回Math.random().toString().substr(2)function generateToken(n) {
    var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    var token = '';
    for(var i = 0; i < n; i++) {
        token += chars[Math.floor(Math.random() * chars.length)];
    }
    return token;
}
function generateToken() {
    Math.floor(1000000000000000 + Math.random() * 9000000000000000)
          .toString(36).substr(0, 10)
}