2013-09-05 143 views
2

我做了這樣的東西,但沒有工作。該base48Encode方法的參數我已經用千分之一秒如何生成一個隨機的7個字符的字母數字字符串?

private static final String CHARACTER_SET = "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ"; 

public static String base48Encode(double d) { 
    Double num = Double.valueOf(d); 
    Integer length = CHARACTER_SET.length(); 
    String encodeString = new String(); 
    while (num > length) { 
     encodeString = CHARACTER_SET.charAt(num.intValue() % length) + encodeString; 
     num = Math.ceil(new Double(num/length) - 1); 
    } 
    encodeString = CHARACTER_SET.charAt(num.intValue()) + encodeString; 

    return encodeString; 
} 
+4

可能重複? http://stackoverflow.com/questions/363681/generating-random-numbers-in-a-range-with-java – birryree

+0

你問了一個隨機7位數,或隨機7字符值?您的問題的標題及其內容有衝突。字母數字的 – Syon

+0

遺憾的混亂,應該是混合的,我不會在任何情況下得到重複的值。 –

回答

5

通過當前的系統時間任何情況下我不會重複的值。

這是不可能100%保證獨特的價值(尤其是考慮到7個字符的字符串)由於Birthday Paradox。給定一個包含48個字符的字符集,隨機選擇7個字符,只有110,000個隨機值後,你有1%的碰撞機率。

你可以通過做兩件事來幫助緩解這種情況。

  1. 使用較大的字符集。
  2. 增加隨機值的長度。

使用64個字符的字符集並隨機選擇10將大大降低碰撞的可能性,在160,000,000個隨機值後下降到1%。

而不是使用currentTimeMillis來產生一個值,如果您在同一毫秒內生成兩個值,將導致衝突,我建議只使用Random類(它從當前時間下到納秒) 。

private static final String CHARACTER_SET = "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ"; 
private static Random rnd = new Random(); 

public static String randomString(int length){ 
    StringBuilder builder = new StringBuilder(); 
    for(int i = 0; i < length; i++){ 
     builder.append(CHARACTER_SET.charAt(rnd.nextInt(CHARACTER_SET.length()))); 
    } 
    return builder.toString(); 
} 
+0

謝謝Syon!我同意,100%不可能保證一個唯一的值(特別是給定一個7個字符的字符串) –

相關問題