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)相同的結果)
添加回答
舉報