2012-02-09 114 views
2

我需要生成正好長度爲6(不少於,不多於)的唯一非順序字母數字字符串。 非順序我的意思是它應該看起來一目瞭然,而不是來自一個序列(如果你能在幾天的研究之後找到序列並不重要,它應該在第一眼看起來是隨機的) 。 並牢記它必須是獨一無二的。 查找已經使用的所有數字也是不可行的。生成長度爲6的唯一非順序字母數字字符串

我正在考慮讓數據庫生成一個唯一的數字,然後應用一些函數將該數字轉換爲長度爲6的唯一非順序字母數字字符串。與哈希算法的工作原理類似,但沒有可能的衝突。

我找到了這個:http://blog.maxant.co.uk/pebble/2010/02/02/1265138340000.html 但是這個序列並不是視覺上隨機的。

回答

0

是否有可能將生成的字符串序列註冊到某個數據庫/文件/某處?然後,一種方法可以爲每個位置(從1到6),隨機挑選一個字符並形成6個字符的字符串。看看它是否是註冊序列之一。如果已經註冊,則生成另一個序列。如果沒有註冊,則註冊&使用生成的用於您的目的。

+0

如果系統運行了一段時間,則需要進行大量的重試。 – user968698 2012-02-10 11:14:46

0

由字母數字你是瞄準[A-Z0-9],[a-zA-Z0-9][a-zA-Z0-9\+\\]是可以接受的嗎?在後一種情況下,您可以作弊,XOR您的唯一ID以適當大的值,然後通過Base64算法拋出整個程序,節省工作量。

對於另外兩個,從簡單的僞隨機數發生器的書中抽出一片葉子;執行類似x = ((id + salt)*multiplier) mod pow(alphabet_size,6)之類的操作,然後將整數x解碼爲字母數字字符。當然選擇一個好的saltmultiplier很重要;後者理想情況下是一個大素數或至少與alphabet_size相矛盾。 salt甚至可能爲零,但如果您願意,可以用於輸出更具審美價值的產品。

只要初始ID從未超過pow(alphabet_size,6),散列將是唯一可逆的。您需要將您的哈希值轉換回整數,然後使用模塊化的除法算法重新獲得(id + salt),從而獲得原始的id