亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用MySQL生成隨機且唯一的8個字符串

使用MySQL生成隨機且唯一的8個字符串

HUWWW 2019-09-20 16:35:58
我正在開發一款涉及車輛的游戲。我有一個名為“車輛”的MySQL表,其中包含有關車輛的數據,包括存儲車輛牌照的“板”欄?,F在這里出現了我遇到問題的部分。我需要在創建新車輛之前找到未使用的車牌 - 它應該是一個字母數字8字符隨機字符串。我是如何實現這一點的是在Lua中使用while循環,這是我正在編程的語言,用于生成字符串并查詢DB以查看它是否被使用。然而,隨著車輛數量的增加,我預計現在這種情況會變得更加低效。因此,我決定嘗試使用MySQL查詢解決此問題。我需要的查詢應該只生成一個8字符的字母數字字符串,該字符串不在表中。我再次想到了生成和檢查循環方法,但我并沒有將這個問題局限于那個問題,以防萬一更有效。我已經能夠通過定義一個包含所有允許的字符的字符串并隨機地對其進行子字符串來生成字符串,僅此而已。任何幫助表示贊賞。
查看完整描述

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()(但我會考慮將此邏輯移至應用層)。


查看完整回答
反對 回復 2019-09-20
?
青春有我

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)相同的結果)


查看完整回答
反對 回復 2019-09-20
  • 3 回答
  • 0 關注
  • 2281 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號