[求助] 怎么随机产生不重复的 18 位序列类似 MD5

2020-12-18 08:15:43 +08:00
 stone000
怎么随机产生不重复的 18 位序列类似 MD5 这种,或者随机生成 17 位+1 位校验位
如果产生重复的就通过校验位来处理
5388 次点击
所在节点    程序员
36 条回复
opengps
2020-12-18 08:17:53 +08:00
18 位重复的概率已经够低了,需要强制不重复,那就考虑下中间某几位加入毫秒级时间因素
CEBBCAT
2020-12-18 08:27:07 +08:00
递增…
loading
2020-12-18 08:30:55 +08:00
unix 时间戳改成 36 进制(字母+数字)然后再拼接一点随机
liuzhaowei55
2020-12-18 08:36:07 +08:00
产生速度?不快的话就存起来
netnr
2020-12-18 08:38:11 +08:00
c# 可以生成 GUID 再转 long 长度好像是 19 位,再截取处理一下
40EaE5uJO3Xt1VVa
2020-12-18 08:40:12 +08:00
时间戳已经不可重复了,用 md5 加密时间戳字符串。

字符串 1608251975
16 位 小写 b555936fee3a6904
16 位 大写 B555936FEE3A6904
32 位 小写 db59d207b555936fee3a6904d80629b4
32 位 大写 DB59D207B555936FEE3A6904D80629B4
stone000
2020-12-18 08:50:21 +08:00
比如輸入 A 物品,得到一個唯一 18 位序列號 A18,下次再輸入 A 物品還是得到 A18
zachlhb
2020-12-18 08:53:12 +08:00
按一些规律编码再截取不就行了
bnlt
2020-12-18 08:54:10 +08:00
先用自增生成 0001 0002 这样的序列,然后用可逆对称加密算法对其加密,每次都会得到一个看似随机,而且不会重复的值。

类似功能我很早之前写过一个,用来在 PostgreSQL 里面实现类似题主的需求,数据库已经没了,代码有一份放在 runjs 上,今天想去看看,结果网站也已经关了……

当时用的加密算法的名字忘了,但实现很简单,大概 10 行代码左右,秘钥长度和明文长度一样,照着维基百科上面对那个算法的说明写出来的,大致过程是循环替换。

有谁知道是什么加密算法吗,也帮我回忆回忆
jorneyr
2020-12-18 08:57:15 +08:00
计算的到 MD5 后,冲突时随机把中间得某 1 位,2 位,3 位的大小写变化一下,直到不冲突
TomVista
2020-12-18 08:57:27 +08:00
考虑线程安全吗?🐶
stone000
2020-12-18 08:58:29 +08:00
@TomVista 不考慮
TomVista
2020-12-18 09:15:30 +08:00
@stone000 时间戳拼接随机字符串 可能是最简单的方法了
yogogo
2020-12-18 09:32:12 +08:00
我现在一个做法是先 md5(uniqid())获取一个随机串,然后再把随机串打乱获取 18 位。
rimutuyuan
2020-12-18 09:35:04 +08:00
时间戳 + 时间戳的 md5[:18]

每次生成前 sleep 1 nano second
swithinzhang
2020-12-18 09:44:58 +08:00
@yogogo #14 这不是画蛇添足吗
no1xsyzy
2020-12-18 10:06:53 +08:00
产生重复用校验位处理?那还叫校验位吗?

#7 你 MD5 截前 18 位不就行了(
描述修改了你还是 append 吧
lwlizhe
2020-12-18 10:13:49 +08:00
抬个杠

md5 本身也是有冲突概率的;当然那概率小到只要不是特意针对,基本不会发生冲突的情况,所以放心大胆的把 md5 当作一般文件的校验指纹没啥问题;

但是因此 md5 的方式并不绝对完美,或者应该说有压缩的算法基本都会有冲突吧~~
ElmerZhang
2020-12-18 10:15:36 +08:00
两处 hash 方式各取一段拼成 18 位
lwlizhe
2020-12-18 10:18:44 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/736606

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX