社区
MySQL
帖子详情
关于唯一随机字符串的讨论
聪明的一休
2012-01-12 03:17:10
最近有个需求,按批次生成一定数量的18位唯一随机字符串(数字,大小写字母组成)。
因为考虑到效率,不可能生成一个去表里遍历是否存在,所以我每个批次生成6位批次号,再用rand生成12位随机字符串放在批次号后面组成18位字符串,当然这样虽然大大减少了重复的可能性,还是不能保证完全重复,存储过程还是需要事务去保证以防主键重复。
不知道各位有没有什么更优的方法解决此类问题?
...全文
395
11
打赏
收藏
关于唯一随机字符串的讨论
最近有个需求,按批次生成一定数量的18位唯一随机字符串(数字,大小写字母组成)。 因为考虑到效率,不可能生成一个去表里遍历是否存在,所以我每个批次生成6位批次号,再用rand生成12位随机字符串放在批次号后面组成18位字符串,当然这样虽然大大减少了重复的可能性,还是不能保证完全重复,存储过程还是需要事务去保证以防主键重复。 不知道各位有没有什么更优的方法解决此类问题?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
biandongfeng
2012-02-02
打赏
举报
回复
前面用年月日时分秒,后面加上你所需要的串
聪明的一休
2012-01-20
打赏
举报
回复
第一个问题,的确是你没理解我的意思,1000个随机串我只对流水号做一个一次检查,后12位并没做检查。
第二个问题,是我理解错了,我以为是用mysql的md5函数,因为当初发起这个讨论只是找数据库层面的解决方案。
[Quote=引用 8 楼 jiahehao 的回复:]
第一个问题,如果你对这1000个随机串的后12位都做唯一性检查,当然能保证唯一,但是会损失时间。而我的默认前提是只管生成,不管校验。所以在此前提下,你的这个批次号 + 随机串 会提高重复性。
第二个问题,我想你对RSA加密算法还不太了解。它所达到的效果就是和:“如果你不能解决随机字符串的唯一性问题的话,后面再加密也是徒劳的。”这句话是相反的。我在前面说过,哪怕是相同的一个随机串,进去加密后,出来的密文也是绝对不一样的。
[/Quote]
聪明的一休
2012-01-20
打赏
举报
回复
这是一种比较好的实现方式,我试了50万条记录
[Quote=引用 7 楼 shine333 的回复:]
如果只考虑唯一及均匀分布的话,不考虑效率的话,
CONCAT(
LEFT(CONV(CRC32(RAND()), 16, 36), 6), -- 前6位为rand的crc32的前6位,以36进制表示(0-9,A=10,Z=36)
LEFT(CONV(CRC32(UUID()), 16, 36), 6), -- 中间6位,用UUID
L……
[/Quote]
jiahehao
2012-01-17
打赏
举报
回复
[Quote=引用 5 楼 wfevgch 的回复:]
关于重复的可能性,你可能还没理解我的意思,比如我一个批次生成1000个随机串,我先生成一个批次号,可以在批次表里检查唯一性,这样我只要保证后面12位在1000个中的唯一性,而不需要保证在全表中的唯一性了。所以是大大减少了重复的可能性。
至于你说的加密算法,如果你不能解决随机字符串的唯一性问题的话,后面再加密也是徒劳的。我们主要需要解决唯一性问题。当然如果我们先用唯一时间戳再MD5加密的话,和……
[/Quote]
第一个问题,如果你对这1000个随机串的后12位都做唯一性检查,当然能保证唯一,但是会损失时间。而我的默认前提是只管生成,不管校验。所以在此前提下,你的这个批次号 + 随机串 会提高重复性。
第二个问题,我想你对RSA加密算法还不太了解。它所达到的效果就是和:“如果你不能解决随机字符串的唯一性问题的话,后面再加密也是徒劳的。”这句话是相反的。我在前面说过,哪怕是相同的一个随机串,进去加密后,出来的密文也是绝对不一样的。
shine333
2012-01-16
打赏
举报
回复
如果只考虑唯一及均匀分布的话,不考虑效率的话,
CONCAT(
LEFT(CONV(CRC32(RAND()), 16, 36), 6), -- 前6位为rand的crc32的前6位,以36进制表示(0-9,A=10,Z=36)
LEFT(CONV(CRC32(UUID()), 16, 36), 6), -- 中间6位,用UUID
LEFT(CONV(CRC32(SIN(RAND())), 16, 36), 6) -- 最后6位,用sin(rand())
)
或者其他类似的方法,注意CONV只能处理32bit,所以必须分段处理。
聪明的一休
2012-01-13
打赏
举报
回复
关于重复的可能性,你可能还没理解我的意思,比如我一个批次生成1000个随机串,我先生成一个批次号,可以在批次表里检查唯一性,这样我只要保证后面12位在1000个中的唯一性,而不需要保证在全表中的唯一性了。所以是大大减少了重复的可能性。
至于你说的加密算法,如果你不能解决随机字符串的唯一性问题的话,后面再加密也是徒劳的。我们主要需要解决唯一性问题。当然如果我们先用唯一时间戳再MD5加密的话,和UUID是一个问题,MD5生成出来是16位和32位。
[Quote=引用 4 楼 jiahehao 的回复:]
"所以我每个批次生成6位批次号,再用rand生成12位随机字符串放在批次号后面组成18位字符串,当然这样虽然大大减少了重复的可能性,"
你这种 批次号 + 12位随机串 的方式只是易于管理查验,并不能“大大减少了重复的可能性”,相反,是“大大提高了重复的可能性”,因为你会有相当多的数据前6位是相同的。
有个思路,你先只管生成18位随机字符串,然后找个加密算法过一遍,取生成的密文为正式……
[/Quote]
jiahehao
2012-01-13
打赏
举报
回复
"所以我每个批次生成6位批次号,再用rand生成12位随机字符串放在批次号后面组成18位字符串,当然这样虽然大大减少了重复的可能性,"
你这种 批次号 + 12位随机串 的方式只是易于管理查验,并不能“大大减少了重复的可能性”,相反,是“大大提高了重复的可能性”,因为你会有相当多的数据前6位是相同的。
有个思路,你先只管生成18位随机字符串,然后找个加密算法过一遍,取生成的密文为正式字符串。因为象RSA、MD5这类的现代加密算法都有个特点:同样的明文进去,出来的密文仍然不同。所以,就算你进去的字符串是一样的,出来的密文也肯定不一样。
iihero
2012-01-13
打赏
举报
回复
如果只是18位,取uuid的第9到26位,并加上是否重复键判断,总体效果也还算不错。重复的机率比较小。
ACMAIN_CHM
2012-01-12
打赏
举报
回复
直接找种算法,把 1,2,3,4 这样的序列转换成 18 位字符串。
聪明的一休
2012-01-12
打赏
举报
回复
要求是18位,你用uuid的话,截字符串的话就不能保证唯一了。
[Quote=引用 1 楼 rucypli 的回复:]
直接用uuid啊
mysql> select replace(uuid(),'-','');
+----------------------------------+
| replace(uuid(),'-','') |
+----------------------------------+
| 674a5c443cf211e1a2440019b9e04a91 |……
[/Quote]
rucypli
2012-01-12
打赏
举报
回复
直接用uuid啊
mysql> select replace(uuid(),'-','');
+----------------------------------+
| replace(uuid(),'-','') |
+----------------------------------+
| 674a5c443cf211e1a2440019b9e04a91 |
+----------------------------------+
1 row in set (0.00 sec)
java生成
字符串
数组_Java 生成
随机
字符串
数组的实例详解
Java 生成
随机
字符串
数组的实例详解利用Collections.sort()方法对泛型为String的List 进行排序。具体要求:1.创建完List之后,往其中添加十条
随机
字符串
2.每条
字符串
的长度为10以内的
随机
整数3.每条
字符串
的每个字符都为
随机
生成的字符,字符可以重叠4.每条
随机
字符串
不可重复将涉及到的知识有: String、StringBuffer、ListArray、泛型、Colle...
在 JavaScript 中生成
随机
字符串
/字符
我想要一个由从集合 [a-zA-Z0-9] 中
随机
挑选的字符组成的 5 个字符的
字符串
。使用 JavaScript 执行此操作的最佳方法是什么?
java
字符串
数组实例_Java 生成
随机
字符串
数组的实例详解
Java 生成
随机
字符串
数组的实例详解利用Collections.sort()方法对泛型为String的List 进行排序。具体要求:1.创建完List之后,往其中添加十条
随机
字符串
2.每条
字符串
的长度为10以内的
随机
整数3.每条
字符串
的每个字符都为
随机
生成的字符,字符可以重叠4.每条
随机
字符串
不可重复将涉及到的知识有: String、StringBuffer、ListArray、泛型、Colle...
java创建字符数组_Java 生成
随机
字符串
数组的实例详解
Java 生成
随机
字符串
数组的实例详解发布时间:2020-08-20 23:12:20来源:脚本之家阅读:118作者:Yanci516Java 生成
随机
字符串
数组的实例详解利用Collections.sort()方法对泛型为String的List 进行排序。具体要求:1.创建完List之后,往其中添加十条
随机
字符串
2.每条
字符串
的长度为10以内的
随机
整数3.每条
字符串
的每个字符都为
随机
生成的字符,...
JAVA如何生成
随机
不重复
字符串
JAVA如何生成
随机
不重复
字符串
问题详情问题分析从问题的要求来看,可以分部实现:1、实现
随机
字符的生成从而实现
字符串
的生成。2、实现
字符串
与
字符串
之间的不重复性。代码实现测试结果 问题详情 在工作中碰到了这个场景,要生产一系列不重复的
字符串
放到一个数组中去,其中
字符串
由a-z,A-Z,0-9
随机
组成,而且不能出现重复
字符串
。如提供数组长度length,
字符串
个数size 问题分析 从问题的要求来看,可以分部实现: 1、实现
随机
字符的生成从而实现
字符串
的生成。 由于
字符串
是由字符组成,所以实现生成
随机
的字符
MySQL
56,938
社区成员
56,755
社区内容
发帖
与我相关
我的任务
MySQL
MySQL相关内容讨论专区
复制链接
扫一扫
分享
社区描述
MySQL相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章