mysql随机8位_sql - 使用MySQL生成随机且唯一的8个字符串

sql - 使用MySQL生成随机且唯一的8个字符串

我正在开发一款涉及车辆的游戏。 我有一个名为“车辆”的MySQL表,其中包含有关车辆的数据,包括存储车辆牌照的“板”栏。

现在这里出现了我遇到问题的部分。 我需要在创建新车辆之前找到未使用的车牌 - 它应该是一个字母数字8字符随机字符串。 我是如何实现这一点的是在Lua中使用while循环,这是我正在编程的语言,用于生成字符串并查询DB以查看它是否被使用。 然而,随着车辆数量的增加,我预计现在这种情况会变得更加低效。 因此,我决定尝试使用MySQL查询解决此问题。

我需要的查询应该只生成一个8字符的字母数字字符串,该字符串不在表中。 我再次想到了生成和检查循环方法,但我并没有将这个问题局限于那个以防万一更有效的问题。 我已经能够通过定义一个包含所有允许的字符的字符串并随机地对其进行子字符串来生成字符串,仅此而已。

任何帮助表示赞赏。

17个解决方案

68 votes

这个问题包含两个非常不同的子问题:

字符串必须看似随意

字符串必须是唯一的

虽然很容易实现随机性,但没有重试循环的唯一性则不然。 这使我们首先专注于独特性。 使用AUTO_INCREMENT可以轻松实现非随机唯一性。因此,使用唯一性保留,伪随机变换可能会很好:

@paul建议使用Hash

AES加密也适合

但有一个很好的:id本身!

保证由同一种子创建的一系列随机数

重复性

前8次迭代不同

如果种子是INT32

所以我们使用@ AndreyVolk或@ GordonLinoff的方法,但使用种子id:

例如 Assumin id是一个AUTO_INCREMENT col:

INSERT INTO vehicles VALUES (blah); -- leaving out the number plate

SELECT @lid:=LAST_INSERT_ID();

UPDATE vehicles SET numberplate=concat(

substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@lid)*4294967296))*36+1, 1),

substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),

substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),

substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),

substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),

substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),

substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),

substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed)*36+1, 1)

)

WHERE id=@lid;

Eugen Rieck answered 2019-06-12T07:24:15Z

67 votes

正如我在评论中所说,我不会为碰撞的可能性而烦恼。 只需生成一个随机字符串并检查它是

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值