我有一個users
表,我需要爲每個用戶創建一個唯一的,隨機的字母數字「ID」(它們通常具有自動增量ID)。這個標識符必須:如何生成與給定模式匹配的隨機外觀唯一標識
- 是唯一
- 是隨機尋找
- 匹配的模式
AAAA-1234
(4個字母,4個數字)
有沒有更好的辦法,而不是不斷隨機生成的字符串,直到我發現一個不在數據庫中的呢?
我有一個users
表,我需要爲每個用戶創建一個唯一的,隨機的字母數字「ID」(它們通常具有自動增量ID)。這個標識符必須:如何生成與給定模式匹配的隨機外觀唯一標識
AAAA-1234
(4個字母,4個數字)有沒有更好的辦法,而不是不斷隨機生成的字符串,直到我發現一個不在數據庫中的呢?
爲每個用戶指定一個無聊舊順序的整數(或使用您提到的其他ID)。稱它爲$x
。
Set $x = (($x + 2135587861) * 2654435769) & 0xffffffff
。
設置$x = $x^($x >> 15)
。
再次設置$x = (($x + 2135587861) * 2654435769) & 0xffffffff
。
計算$x % 26
並根據結果選擇一個字母a-z。設置$x = $x/26
。重複四次(我不知道PHP,所以你在這裏得到口頭指示)。
計算$x % 10
並根據結果選擇數字0-9。設置$x = $x/10
。重複四次。
頭六個結果我得到的是:
HSQG-2102
DNQO-1176
TEKJ-5435
EHWX-6540
UPPH-0450
MVIX-5036
這不完全完美,但它是不明顯的。也許這就夠了。
此外,它只適用於前40億(ish)用戶在碰撞之前,但這只是一點點的字符串格式的限制。
當你說'隨機看'你的意思是這些數字不應該是相應的? –
@PavelPetrov – nXu
可能是您需要的算法類似於生成信用卡號碼的算法。如果你在Cryptography SE中提出這個問題,你可能會得到更好的答案。 –