2010-12-09 44 views
1

我試圖生成非重複字母數字代碼的列表。它們將以批量和批量生成,使得明確查看之前生成的內容是不可行的 - 即獨特性需要以某種方式得到保證,而無需藉助當前批次之外的先前代碼。生成字母數字代碼的非重複列表

代碼長度應爲8個字符,並且約束條件是某些字符不能出現在代碼中(例如l和L),因爲用戶將在以後重新輸入這些字符。

我可能會實現這個在Java中,但我會很感激任何算法或技巧任何人都可以解決這一想到...

問候,

+1

只有有限數量的8個字符的組合 - 很明顯,他們會在一段時間後重復*。 – casablanca 2010-12-09 15:16:33

+1

請參閱http://stackoverflow.com/tags/license-key/faq – 2010-12-09 15:18:32

回答

4

就拿System.currentTimeMillis的對其進行編碼通過將每個數字映射到一個字母來進行字母數字化。跟蹤發佈的最後一個(在同一毫秒內重複監視多代)並相應處理。

2

所述的問題具有明顯的解決方案,即從零開始順序生成代碼。將每個代碼視爲基數爲34的數字(數字爲0-9A-Z,但IL除外)。如果這不是你可能想澄清的問題,你想要的東西(比如你想要的隨機性?)

編輯:當然,這需要你記住你最後生成的代碼,並進行這一個資料片跨批次。

3

你可以只編碼原子計數器如

AtomicInteger counter = new AtomicInteger(); 

public String generateId() { 
    return Integer.toHexString(counter.getAndIncrement()); 
} 

這會給你04十億唯一的ID。

如果你需要超過40億,你可以使用AtomicLong並根據你想要允許的字符使用你自己的編碼。

0

8個嵌套循環可以輕鬆解決您的問題。 此外,如果你想要的話,你可以使用隨機生成下一個令牌並將所有令牌存儲在Set中。每當你得到新的令牌時,檢查它是否已經被設置。

0

太糟糕了,你被限制爲8個字符。否則,您可以使用MD5類生成唯一代碼。

無論如何,如果你想確保你的代碼是唯一的,你可以在一些代碼字符中編碼生成日期,以確保它不會與先前的代碼發生衝突。

例如,你的代碼將有形式YMDXXXXX,其中:

  • Y是自2010年(從0開始,當你在2020年跑出的數字開始使用字母)
  • M是當月(相同標準)
  • D是當天(不會大於31,因此字符0-9A-Z應該足夠)
  • X是您當前批生成的代碼。
0

你能像這樣迭代嗎?

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個字符

而且我的程序並不知道大,小寫字母的區別。如果你需要,那麼應用程序將會更復雜,因爲我們需要一個數組而不是一個長數字。