基于用户详细信息在Javascript中创建随机令牌
我想创建一个随机字符串(令牌),它可以用来识别用户,同时避免与任何其他用户的令牌发生任何潜在冲突 我想到的是一个MD5哈希值基于用户详细信息在Javascript中创建随机令牌,javascript,jquery,random,token,Javascript,Jquery,Random,Token,我想创建一个随机字符串(令牌),它可以用来识别用户,同时避免与任何其他用户的令牌发生任何潜在冲突 我想到的是一个MD5哈希值navigator.userAgent+new Date().getTime(),以生成令牌,但这需要一个完整的Javascript MD5库来对其进行哈希,我并不想这样做 它必须由A-Z/0-9个字符组成,最好不超过32个字符。我对所有的想法都持开放态度。谢谢 我只是想澄清一下,我不是在寻找任何随机字符串生成器,随机字符串必须根据Javascript提供的用户详细信息生成
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)正如您所写的,我唯一想到的是哈希函数。你可能想用谷歌搜索一些类似“哈希函数javascript”的东西,也许你会发现一些轻量级的东西好吧,我已经放弃使用MD5,加密看起来像一个小库谢谢!不要使用md5。另一个答案是更小更快,但我喜欢这样一个事实,它允许您选择长度和允许的字符。
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)
}