为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUWWW 2019-09-20 16:35:58
我正在开发一款涉及车辆的游戏。我有一个名为“车辆”的MySQL表,其中包含有关车辆的数据,包括存储车辆牌照的“板”栏。现在这里出现了我遇到问题的部分。我需要在创建新车辆之前找到未使用的车牌 - 它应该是一个字母数字8字符随机字符串。我是如何实现这一点的是在Lua中使用while循环,这是我正在编程的语言,用于生成字符串并查询DB以查看它是否被使用。然而,随着车辆数量的增加,我预计现在这种情况会变得更加低效。因此,我决定尝试使用MySQL查询解决此问题。我需要的查询应该只生成一个8字符的字母数字字符串,该字符串不在表中。我再次想到了生成和检查循环方法,但我并没有将这个问题局限于那个问题,以防万一更有效。我已经能够通过定义一个包含所有允许的字符的字符串并随机地对其进行子字符串来生成字符串,仅此而已。任何帮助表示赞赏。
查看完整描述

3 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

正如我在评论中所说,我不会为碰撞的可能性而烦恼。只需生成一个随机字符串并检查它是否存在。如果是这样,请再试一次,除非已经分配了大量的印版,否则你不应该多做几次。


另一种在pure(My)SQL中生成8个字符长的伪随机字符串的解决方案:


SELECT LEFT(UUID(), 8);

您可以尝试以下(伪代码):


DO 

    SELECT LEFT(UUID(), 8) INTO @plate;

    INSERT INTO plates (@plate);

WHILE there_is_a_unique_constraint_violation

-- @plate is your newly assigned plate number

由于这篇文章引起了意想不到的关注,让我强调一下ADTC的评论:上面的代码非常愚蠢并产生连续的数字。


对于稍微不那么愚蠢的随机性尝试这样的事情:


SELECT LEFT(MD5(RAND()), 8)

对于真正的(密码安全的)随机性,使用RANDOM_BYTES()而不是RAND()(但我会考虑将此逻辑移至应用层)。


查看完整回答
反对 回复 2019-09-20
?
青春有我

TA贡献1784条经验 获得超8个赞

如何计算连续整数的MD5(或其他)哈希值,然后取前8个字符。



MD5(1) = c4ca4238a0b923820dcc509a6f75849b => c4ca4238

MD5(2) = c81e728d9d4c2f636f067f89cc14862c => c81e728d

MD5(3) = eccbc87e4b5ce2fe28308fd9f2a7baf3 => eccbc87e

等等


警告:我不知道你可以在碰撞之前分配多少(但它将是一个已知的恒定值)。


编辑:现在这是一个古老的答案,但我再次看到它的时间在我的手上,所以,从观察......


所有数字的机会= 2.35%


所有字母的机会= 0.05%


MD5(82945)=“7b763dcb ...”时的第一次碰撞(与MD5(25302)相同的结果)


查看完整回答
反对 回复 2019-09-20
  • 3 回答
  • 0 关注
  • 2104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信