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

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

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

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

任何帮助表示赞赏。


HUWWW
浏览 2115回答 3
3回答

一只萌萌小番薯

正如我在评论中所说,我不会为碰撞的可能性而烦恼。只需生成一个随机字符串并检查它是否存在。如果是这样,请再试一次,除非已经分配了大量的印版,否则你不应该多做几次。另一种在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()(但我会考虑将此逻辑移至应用层)。

青春有我

如何计算连续整数的MD5(或其他)哈希值,然后取前8个字符。即MD5(1) = c4ca4238a0b923820dcc509a6f75849b => c4ca4238MD5(2) = c81e728d9d4c2f636f067f89cc14862c => c81e728dMD5(3) = eccbc87e4b5ce2fe28308fd9f2a7baf3 => eccbc87e等等警告:我不知道你可以在碰撞之前分配多少(但它将是一个已知的恒定值)。编辑:现在这是一个古老的答案,但我再次看到它的时间在我的手上,所以,从观察......所有数字的机会= 2.35%所有字母的机会= 0.05%MD5(82945)=“7b763dcb ...”时的第一次碰撞(与MD5(25302)相同的结果)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MySQL