最近有个需求,按批次生成一定数量的18位唯一随机字符串(数字,大小写字母组成)。
因为考虑到效率,不可能生成一个去表里遍历是否存在,所以我每个批次生成6位批次号,再用rand生成12位随机字符串放在批次号后面组成18位字符串,当然这样虽然大大减少了重复的可能性,还是不能保证完全重复,存储过程还是需要事务去保证以防主键重复。不知道各位有没有什么更优的方法解决此类问题?
因为考虑到效率,不可能生成一个去表里遍历是否存在,所以我每个批次生成6位批次号,再用rand生成12位随机字符串放在批次号后面组成18位字符串,当然这样虽然大大减少了重复的可能性,还是不能保证完全重复,存储过程还是需要事务去保证以防主键重复。不知道各位有没有什么更优的方法解决此类问题?
解决方案 »
- MySQL中有没有类似@@ROWCOUNT的系统变量(存储过程)
- 真诚请教大家关于MYSQL性能优化方案报表工具的问题
- 新手请教关于数据查询模糊匹配问题
- Insert all 方法在MYSQL数据库中是否可以使用
- mysql不能连接本机服务器
- mysql数据库损坏了,建表时只有.frm文件能否恢复数据库。
- 菜鸟请求帮忙如何在ID字段内容上加上字母
- 最后10分了,求助一个问题:我如何用程序得知我的系统上是否安装了MYSQL,如果装了则如何获得它的版本号!
- 如何获得排名
- PHP和MYSQL的配置问题?急!!!!!!!!!!
- mysql 如何实现时间隔调用存储过程
- MYSQL存储过程内创建视图的问题
mysql> select replace(uuid(),'-','');
+----------------------------------+
| replace(uuid(),'-','') |
+----------------------------------+
| 674a5c443cf211e1a2440019b9e04a91 |
+----------------------------------+
1 row in set (0.00 sec)
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,所以必须分段处理。
第一个问题,如果你对这1000个随机串的后12位都做唯一性检查,当然能保证唯一,但是会损失时间。而我的默认前提是只管生成,不管校验。所以在此前提下,你的这个批次号 + 随机串 会提高重复性。第二个问题,我想你对RSA加密算法还不太了解。它所达到的效果就是和:“如果你不能解决随机字符串的唯一性问题的话,后面再加密也是徒劳的。”这句话是相反的。我在前面说过,哪怕是相同的一个随机串,进去加密后,出来的密文也是绝对不一样的。