uid生成方面
1:为什么用雪花算法
分布式ID的唯一性需要保证,同时需要做到
1:单调递增
2:确保安全,一个是要能体现出递增的单号,二一个不能轻易的被恶意爬出订单数量
3:含有时间戳
4:高可用,低延迟
5:高QPS
2:雪花算法构成
0(符号位)41位(bits)的时间戳10位机器码12位序列号,可以根据时间戳长短调整。
时间戳记录的是毫秒数,最多表示69年。机器码可以确保在多个服务器上生成ID的唯一性,如果跨机房部署,可以把10位拆成5位机房id+5位机器id。10个比特最多1024个机器。序列号是在时间相同是生成不同标识的,同一毫秒可以产生4096的ID。
3:时间回拨问题
没问到,但是可以了解。
回拨时间小的时候,不生成ID,循环等待时间点到达。
或者给拓展位+1,或者在序列号中腾出一部分位置来标识。
美团和百度有解决的方案吗,美团的leaf-snowflake:以“1+41+10+12”的方式组装ID号,改动点为:将SnowFlake从本地jar包变成了独立服务,并引入了Zookeeper来解决时钟回拨问题
4:别的算法
百度UidGenerator是Java实现的,基于Snowflake算法的唯一ID生成器。UidGenerator以组件形式工作在应用项目中, 支持自定义workerId位数和初始化策略。
UUID:通用唯一识别码。标准是32位的16进制数字,本地生成不依赖别的。但是不易存储,长度太长,同时uuid无序,信息生成的时候基于MAC地址生成也可能暴露使用者的位置。
数据库自增:设置步长
Redis实现:提供INCR或INCRBY这种自增原子命令,通过Redis单线程保证唯一性
MD5算法:用加盐算法实现,加盐算法意思是每个人在做菜的时候都会放不同的盐,因此代表不重复的标识,可以通过UUID来实现,然后MD5算法就可以通过UUID+密码来生成。
但MD5一是不支持分布式,同时已经在04年被破解了,可以采用更好的sha-256算法