如何随机生成128个二进制位,然后toString

2021-05-08 更新:因为计算机能处理的最小单位是字节,所以生成128个二进制位,也只是生成16个字节,生成办法现在有两个方案:

方案一:每个字节是0-255的整数,可以自己写个随机方法生成16次

方案二:nodejs crypto库自带了randomBytes方法,该方法生成强伪随机数,随机效果可能更好一些,但是也慢一些,第一次生成要5ms

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

随机这个有什么用?uuid想必都听说过,通过随机一个大数字来保证唯一,sessionid也需要这个,sessionid建议128位,当然128位以上更安全。

为什么要toString,因为二进制只有变成string字符串才能显示出来,只有显示出来,人才能看见和分析。

toString的结果,占用字节越少越好,字符串越短越好,便于传输

如果用十六进制表示,一个字节8位,表示为两个十六进制的字符,128位需要32个字符表示,有没有更短的方案

要知道一个字节是无法表示所有的8位,ASCII码一共才100多个,并且有一些控制字符无法显示

可以用一个六十四个字符的码表来表示,大小写字母加10个数字一共62个字符,再加两个特殊字符组成64个,其实这就是base64的原理,我曾经自己设计了跟base64一样的东西,后来发现这跟base64如出一辙,我的设计如下:

一个六十四进制可以表示6位二进制,所以132位可以用22个六十四进制的字符表示,这就比十六进制表示节省近1/3的字符

 

编程语言JavaScript,随机函数如下,该函数返回[a, b]区间的一个整数,经验证,该函数是均匀随机的,存在的误差可以忽略

const rand = (a, b) => {
    return Math.floor(Math.random() * (b - a + 1) + a);
};

随机生成132位对应的字符串的函数如下:

const chars64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890$_';
const randbits132 = () => {
    let s = '';
    for(let i = 0; i < 22; i++){
        s += chars64[rand(0, 63)];
    }
    return s;
};

2的132次方 = 64的22次方

该函数的效率:本机执行生成20000次,耗时25毫秒左右,cpu频率为3.6GHZ

 

后来发现nodejs Buffer自带的toString函数可以转base64,比这个快几毫秒,于是更新了该文章,还是使用自带的为好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值