3 回答

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊
正如我在評(píng)論中所說(shuō),我不會(huì)為碰撞的可能性而煩惱。只需生成一個(gè)隨機(jī)字符串并檢查它是否存在。如果是這樣,請(qǐng)?jiān)僭囈淮危且呀?jīng)分配了大量的印版,否則你不應(yīng)該多做幾次。
另一種在pure(My)SQL中生成8個(gè)字符長(zhǎng)的偽隨機(jī)字符串的解決方案:
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
由于這篇文章引起了意想不到的關(guān)注,讓我強(qiáng)調(diào)一下ADTC的評(píng)論:上面的代碼非常愚蠢并產(chǎn)生連續(xù)的數(shù)字。
對(duì)于稍微不那么愚蠢的隨機(jī)性嘗試這樣的事情:
SELECT LEFT(MD5(RAND()), 8)
對(duì)于真正的(密碼安全的)隨機(jī)性,使用RANDOM_BYTES()而不是RAND()(但我會(huì)考慮將此邏輯移至應(yīng)用層)。

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個(gè)贊
如何計(jì)算連續(xù)整數(shù)的MD5(或其他)哈希值,然后取前8個(gè)字符。
即
MD5(1) = c4ca4238a0b923820dcc509a6f75849b => c4ca4238
MD5(2) = c81e728d9d4c2f636f067f89cc14862c => c81e728d
MD5(3) = eccbc87e4b5ce2fe28308fd9f2a7baf3 => eccbc87e
等等
警告:我不知道你可以在碰撞之前分配多少(但它將是一個(gè)已知的恒定值)。
編輯:現(xiàn)在這是一個(gè)古老的答案,但我再次看到它的時(shí)間在我的手上,所以,從觀察......
所有數(shù)字的機(jī)會(huì)= 2.35%
所有字母的機(jī)會(huì)= 0.05%
MD5(82945)=“7b763dcb ...”時(shí)的第一次碰撞(與MD5(25302)相同的結(jié)果)
添加回答
舉報(bào)