当前位置: 首页 > 面试题库 >

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

严柏
2023-03-14
问题内容

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

现在是我遇到问题的部分。在创建新车辆之前,我需要找到一个未使用的车牌-
它应该是8个字母数字的随机字符串。我是如何实现的,是在我正在使用的语言Lua中使用while循环生成字符串并查询数据库以查看是否使用了它。但是,随着车辆数量的增加,我希望这将变得目前效率更低。因此,我决定尝试使用MySQL查询解决此问题。

我需要的查询应该只是生成一个8字符的字母数字字符串,该字符串尚未在表中。我再次想到了generate&check循环方法,但是我并没有将这个问题限制为以防万一,这是一个更有效的方法。我已经能够通过定义包含所有允许的字符的字符串并随机将其子串化来生成字符串,仅此而已。

任何帮助表示赞赏。


问题答案:

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

  • 该字符串看似必须是随机的
  • 字符串必须唯一

尽管很容易实现随机性,但没有重试循环的唯一性却不容易。这使我们首先专注于独特性。使用可以轻松实现非随机唯一性AUTO_INCREMENT。因此,使用保留唯一性的伪随机转换就可以了:

  • 哈希由@paul建议
  • AES加密也适合
  • 但是有一个不错的:RAND(N)本身!

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

  • 可复制的
  • 前8次迭代不同
  • 如果种子是 INT32

因此,我们使用@AndreyVolk或@GordonLinoff的方法,但使用以下 种子 RAND

例如,Assumin id是一AUTO_INCREMENT列:

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;


 类似资料:
  • 问题内容: 我正在使用MySql 5.5.37。我有一个包含以下各列的表格 代码列是唯一的,我的ID列是GUID。根据上表中的某些条件,我有许多行想要更新(例如WHERE COLUMN1 = 0)。如何为我的CODE列生成随机的,唯一的6个字符的代码(最好是字母和数字),以使其不违反表中的唯一约束?请注意,表中不符合条件的列(例如COLUMN1 <> 0的位置)已经具有CODE列的唯一值。 编辑:

  • 问题内容: 如何使用数字和字母生成一个随机的,唯一的字符串以用于验证链接?就像您在网站上创建帐户一样,该帐户会向您发送一封包含链接的电子邮件,您必须单击该链接才能验证您的帐户…是的…其中之一。 如何使用PHP生成其中之一? 更新: 刚刚记得。这是一个PHP函数,可根据当前时间(以微秒为单位)生成唯一标识符。我想我会用的。 问题答案: 如果您不需要它随着时间的流逝而变得绝对独特,请执行以下操作: 否

  • 问题内容: 我正在尝试获取0到100之间的随机数。但是我希望它们是唯一的,而不是在序列中重复。例如,如果我有5个数字,它们应该是82,12,53,64,32而不是82,12,53,12,32(我使用了这个数字),但是它在序列中生成相同的数字。 问题答案: Add each number in the range sequentially in a list structure. Shuffle i

  • 问题内容: 我想创建精确的5个随机字符串,并尽可能减少重复。最好的方法是什么?谢谢。 问题答案: 这将是我最好的猜测-除非您也要寻找特殊字符: 例 而且,对于基于时钟的时钟(由于它是递增的,因此冲突较少): 注意:增量意味着更容易猜测; 如果您将其用作盐或验证令牌,请不要使用。盐(现在)为“ WCWyb”表示从现在起5秒钟为“ WCWyg”)

  • 问题内容: 我想测试我的代码的Unicode处理。有什么我可以放入random.choice()从整个Unicode范围中选择的东西,最好不是外部模块吗?Google和StackOverflow似乎都没有答案。 编辑:看起来这比预期的要复杂,所以我将重新表述这个问题- 以下代码足以生成Unicode中的所有有效非控制字符吗? 问题答案: 您可以使用Markus Kuhn 提供的UTF-8压力测试。

  • 本文向大家介绍用Java生成随机字符串,包括了用Java生成随机字符串的使用技巧和注意事项,需要的朋友参考一下 让我们首先声明一个字符串数组并初始化- 现在,创建一个Random对象- 生成随机字符串- 示例 输出结果 让我们再次运行它以获得不同的随机字符串-