我試圖生成非重複字母數字代碼的列表。它們將以批量和批量生成,使得明確查看之前生成的內容是不可行的 - 即獨特性需要以某種方式得到保證,而無需藉助當前批次之外的先前代碼。生成字母數字代碼的非重複列表
代碼長度應爲8個字符,並且約束條件是某些字符不能出現在代碼中(例如l和L),因爲用戶將在以後重新輸入這些字符。
我可能會實現這個在Java中,但我會很感激任何算法或技巧任何人都可以解決這一想到...
問候,
我試圖生成非重複字母數字代碼的列表。它們將以批量和批量生成,使得明確查看之前生成的內容是不可行的 - 即獨特性需要以某種方式得到保證,而無需藉助當前批次之外的先前代碼。生成字母數字代碼的非重複列表
代碼長度應爲8個字符,並且約束條件是某些字符不能出現在代碼中(例如l和L),因爲用戶將在以後重新輸入這些字符。
我可能會實現這個在Java中,但我會很感激任何算法或技巧任何人都可以解決這一想到...
問候,
就拿System.currentTimeMillis的對其進行編碼通過將每個數字映射到一個字母來進行字母數字化。跟蹤發佈的最後一個(在同一毫秒內重複監視多代)並相應處理。
所述的問題具有明顯的解決方案,即從零開始順序生成代碼。將每個代碼視爲基數爲34的數字(數字爲0-9
和A-Z
,但I
和L
除外)。如果這不是你可能想澄清的問題,你想要的東西(比如你想要的隨機性?)
編輯:當然,這需要你記住你最後生成的代碼,並進行這一個資料片跨批次。
你可以只編碼原子計數器如
AtomicInteger counter = new AtomicInteger();
public String generateId() {
return Integer.toHexString(counter.getAndIncrement());
}
這會給你04十億唯一的ID。
如果你需要超過40億,你可以使用AtomicLong並根據你想要允許的字符使用你自己的編碼。
8個嵌套循環可以輕鬆解決您的問題。 此外,如果你想要的話,你可以使用隨機生成下一個令牌並將所有令牌存儲在Set中。每當你得到新的令牌時,檢查它是否已經被設置。
太糟糕了,你被限制爲8個字符。否則,您可以使用MD5類生成唯一代碼。
無論如何,如果你想確保你的代碼是唯一的,你可以在一些代碼字符中編碼生成日期,以確保它不會與先前的代碼發生衝突。
例如,你的代碼將有形式YMDXXXXX
,其中:
0-9A-Z
應該足夠)你能像這樣迭代嗎?
000000a1 000000a2 000000a3 ... 000000ay 000000az 000000b0
然後只記得最後一個號碼和所有未來的數字會比去年
更大您可能會發現這很有
long l = 20492;
String s = "wogjz";
s = Long.toString(l, 26+10-2).replace('I','Y').replace('L','Z') // convert long number to string (with letters)
l = Long.parseLong(s.replace('Y','I').replace('Z','L'), 26+10-2) + 1) // Convert string to number
數字26 + 10-2是字母數加上數字數字減去禁止的字母數(I和L)。 I/Y和Z/L轉換是與Java庫合作使用字母表的最後一個字母。
您將需要確保用戶不要自己輸入I或L,因爲我的代碼無法正常工作。
你會想前導零添加到字符串,直到達到8個字符
而且我的程序並不知道大,小寫字母的區別。如果你需要,那麼應用程序將會更復雜,因爲我們需要一個數組而不是一個長數字。
只有有限數量的8個字符的組合 - 很明顯,他們會在一段時間後重復*。 – casablanca 2010-12-09 15:16:33
請參閱http://stackoverflow.com/tags/license-key/faq – 2010-12-09 15:18:32