根据用户详细信息在Javascript中创建随机令牌

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

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

它必须由AZ / 0-9个字符组成,理想情况下不得超过32个字符。 我对所有想法持开放态度。 谢谢!

为了澄清我不是在寻找任何随机字符串生成器,随机字符串必须通过Javascript提供的用户详细信息生成,并且还可以使用时间来避免潜在的冲突!

checkout crypto.js项目。 它是一系列加密算法。 该项目为每个散列算法都有单独的js文件。

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

 var rand = function() { return Math.random().toString(36).substr(2); // remove `0.` }; var token = function() { return rand() + rand(); // to make it longer }; token(); // "bnh5yzdirjinqaorq0ox1tf383nb3xr" 

此function允许您设置令牌长度和允许的字符。

 function generate_token(length){ //edit the token allowed characters var a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".split(""); var b = []; for (var i=0; i 

只需调用generate_token即可

 generate_token(32); //returns "qweQj4giRJSdMNzB8g1XIa6t3YtRIHPH" 

这是不太可能的,但Math.random()可以返回0.0 。 在这种情况下, pimvdb的解决方案将返回"" (空字符串)。 所以,这是另一种解决方案,它在每种情况下都返回一个10个字符长度的随机base36:

 function generateToken() { Math.floor(1000000000000000 + Math.random() * 9000000000000000) .toString(36).substr(0, 10) } 
 //length: defines the length of characters to express in the string const rand=()=>Math.random(0).toString(36).substr(2); const token=(length)=>(rand()+rand()+rand()+rand()).substr(0,length); console.log(token(40)); //example1: token(10) => result: tsywlmdqu6 //example2: token(40) => result: m4vni14mtln2547gy54ksclhcv0dj6tp9fhs1k10 

我使用类似于Kareem的方法 ,但使用较少的函数调用和内置数组操作来大幅提升性能。

根据性能测试 ,该方法也略微优于接受的答案。 此外,它提供参数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; }