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()(但我会考虑将此逻辑移至应用层)。
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)相同的结果)
添加回答
举报