我正在做一个游戏,在某个时候涉及到车辆。我有一个名为“vehicles”的mysql表,其中包含有关车辆的数据,包括存储车辆牌照的列“plate”。
现在我遇到的问题来了。我需要找到一个未使用的车牌,然后再创建一个新的车辆-它应该是一个字母数字8字符随机字符串。我是如何做到这一点的,是使用lua中的while循环生成字符串并查询db以查看是否使用了它。然而,随着车辆数量的增加,我预计这将变得更加低效,它是现在。因此,我决定尝试使用mysql查询来解决这个问题。
我需要的查询应该只是生成一个表中还没有的8个字符的字母数字字符串。我又想到了generate&check循环方法,但我并没有把这个问题局限于此,以防有更有效的方法。我已经能够通过定义一个包含所有允许的字符的字符串并随机对其进行子串来生成字符串,仅此而已。
感谢您的帮助。
22条答案
按热度按时间zvokhttg1#
我正在寻找类似的东西,我决定制作自己的版本,如果需要的话,也可以指定一个不同的种子(字符列表)作为参数:
可用作:
它将使用内置的大小写字符+数字种子。null也将是值,而不是“”。
但是可以在调用时指定自定义种子:
vzgqcmou2#
您可以使用以下命令生成随机字母数字字符串:
你可以把它用在
BEFORE INSERT
触发并检查while循环中的重复项:现在只需插入数据
触发器将为
plate
列。(sqlfiddle演示)
如果列允许空值,则可以这样做。如果希望它不为null,则需要定义一个默认值
如果大写字母数字不是您想要的,您也可以在触发器中使用任何其他随机字符串生成算法。但触发器将处理唯一性。
fykwrbwg3#
字母表中的8个字母-所有大写字母:
yb3bgrhw4#
这个问题由两个完全不同的子问题组成:
字符串必须看起来是随机的
字符串必须是唯一的
虽然随机性很容易实现,但没有重试循环的唯一性却不是。这就使我们首先集中注意独特性。非随机唯一性可以通过
AUTO_INCREMENT
. 所以使用保持唯一性的伪随机变换就可以了:hash是由@paul建议的
aes加密也适合
但是有一个很好的例子:
RAND(N)
它自己!由同一种子创建的随机数序列保证
可复制的
前8次迭代不同
如果种子是
INT32
所以我们使用了@andreyvolk或@gordonlinoff的方法,但是有一个种子RAND
:e、 g.假设
id
是一个AUTO_INCREMENT
列:gj3fmq9x5#
如何计算连续整数的md5(或其他)散列,然后取前8个字符。
即
等。
警告:我不知道在发生冲突之前可以分配多少(但这是一个已知的常量值)。
编辑:这是一个古老的答案,但随着时间的推移,我又看到了它,所以,从观察中。。。
所有数字的概率=2.35%
所有字母的概率=0.05%
当md5(82945)=“7b763dcb…”时发生第一次碰撞(与md5(25302)的结果相同)
hxzsmxv26#
简单有效的解决方案,可获得随机的10个字符的字符串,其中包含大小写字母和数字:
inn6fuwd7#
对于“生成随机字符串”,可以使用:
SUBSTRING(MD5(RAND()) FROM 1 FOR 8)
你收到的短信是这样的:353E50CC
lymnna718#
如果你对“随机”但完全可预测的车牌号没问题,你可以使用线性反馈移位寄存器来选择下一个车牌号——它保证在重复之前遍历每个号码。然而,如果没有一些复杂的数学,你将无法通过每8个字符的字母数字字符串(你将得到2^41的36^8(78%)可能板)。为了让它更好地填满你的空间,你可以从盘子里去掉一个字母(也许是o),这样你就可以得到97%。
a7qyws3x9#
您可以使用mysql的rand()和char()函数:
pobjuy3210#
生成8个字符的密钥
如何为mysql表中的一列生成唯一的随机字符串?
6jygbczu11#
请使用此存储过程,并随时使用它
w8f9ii6912#
这里有一种方法,使用字母数字作为有效字符:
注:不保证唯一性。你得单独检查一下。
rhfm7lfc13#
生成唯一数字的简单方法
ubbxdtey14#
对于由8个随机数和大小写字母组成的字符串,这是我的解决方案:
由内而外解释:
RAND
生成一个介于0和1之间的随机数MD5
计算a-f和0-9中32个字符(1)的md5和UNHEX
将(2)转换为16字节,值从00到ffTO_BASE64
将(3)编码为base64,从a-z和a-z到0-9加上“/”和“+”,后跟两个“=”三个
REPLACE
s从(4)中删除“/”、“+”和“=”字符LEFT
取(5)中的前8个字符,如果需要在随机字符串中增加或减少字符,请将8改为其他字符LPAD
如果长度小于8个字符,则在(6)开头插入零;同样,如果需要的话,把8换成别的mepcadol15#
如果您没有id或种子,如insert中的值列表: