我之前用的土办法
前面一段是时间戳
后面一段是UUID
然后截取处理+拼接处理成一个64位的long
后来前端技师说JS只能处理53位,要不你改成String吧……
==
snowflake的结构
一共64位
第1位 没用
然后是 41位时间戳,
5位IDC机房区域ID(datacenterId)和5位服务器的机器ID(workerId),
最后12位是这一时间毫秒内的自增加计数
val twepoch = 1288834974657L
private[this] val workerIdBits = 5L
private[this] val datacenterIdBits = 5L
private[this] val sequenceBits = 12L
开始时间取了一个特定值1288834974657,只是为了让时间刚好是41位。
问题是机房ID和机器ID要配置
程序肯定不知道自己的IDC机房区域……
==
mongodb的ObjectId生成是类似的,
但是它不需要机房ID和机器ID,
而是用 当前机器名的哈希值 和 当前进程的PID 来代替,真是个小机灵鬼!
其他一样
最后,不使用MongoDB的时候,也可以引入一个MongoDB的new ObjectId() 这样就获得了一个理想的主键ID
【 在 Xjt 的大作中提到: 】
: 雪花算法最大的问题是生成的id太长了……
--
修改:sanfei FROM 223.104.68.*
FROM 223.104.68.*