[求助] 怎么随机产生不重复的 18 位序列类似 MD5
如果产生重复的就通过校验位来处理
字符串 1608251975
16 位 小写 b555936fee3a6904
16 位 大写 B555936FEE3A6904
32 位 小写 db59d207b555936fee3a6904d80629b4
32 位 大写 DB59D207B555936FEE3A6904D80629B4
类似功能我很早之前写过一个,用来在 PostgreSQL 里面实现类似题主的需求,数据库已经没了,代码有一份放在 runjs 上,今天想去看看,结果网站也已经关了……
当时用的加密算法的名字忘了,但实现很简单,大概 10 行代码左右,秘钥长度和明文长度一样,照着维基百科上面对那个算法的说明写出来的,大致过程是循环替换。
有谁知道是什么加密算法吗,也帮我回忆回忆
每次生成前 sleep 1 nano second
#7 你 MD5 截前 18 位不就行了(
描述修改了你还是 append 吧
md5 本身也是有冲突概率的;当然那概率小到只要不是特意针对,基本不会发生冲突的情况,所以放心大胆的把 md5 当作一般文件的校验指纹没啥问题;
但是因此 md5 的方式并不绝对完美,或者应该说有压缩的算法基本都会有冲突吧~~
可以忽略重复的可能
f = (r, k) ->
((r * k) + 51735) & ((1 << b) – 1)
fc = (n, ks) ->
l = n >> b
r = n & ((1 << b) – 1)
for k in ks
t = l
l = r
r = t ^ f(r, k)
(l << b) + r
r = fc(p, [24358, 25934, 52897, 8057])
return (‘00000000’ + r.toString(16)).slice(-8)
$function$
我找回代码了,但还是不知道里面的算法是什么
18 个由[a-z0-9]组成的字符,那就是 36^18,大约 2^93 次方。
两种方法:
第一种方法,限制没毫秒内调用次数,直接借用 Twitter 的开源分布式 ID 生成算法:snowflake 。
41bit 时间戳;
12bit 的毫秒内序列号(每毫秒最多调用 4096 次,如果需要更多次数,可以放大这部分的长度);
以上这两者,在每秒最多 4096 次调用内,保障了全局唯一。那么剩下 40bit 你自己随便找个快速 hash 算法,然后截取前面 40bit 就行了。
第二种方法,不限制每秒最多调用次数,但限制总长度。
x Bit,从 1 开始的自增 ID,x 为 2^x 的长度,由自增 + 放号业务来保障全局唯一。
剩下 93-x,随便找个快速 hash 算法,然后截取最前面的 93-xbit 就行了。
以后尽可能不和数学不好的人共事……