Как сгенерировать случайную буквенно-цифровую строку? - PullRequest
1606 голосов
/ 03 сентября 2008

Я искал простой алгоритм Java для генерации псевдослучайной буквенно-цифровой строки. В моей ситуации он будет использоваться в качестве уникального идентификатора сеанса / ключа, который «вероятно» будет уникальным в течение 500K+ генерации (мои потребности на самом деле не требуют ничего более сложного)

В идеале я мог бы указать длину в зависимости от моих потребностей в уникальности. Например, сгенерированная строка длиной 12 может выглядеть примерно так: "AEYGF7K0DM1X".

Ответы [ 45 ]

0 голосов
/ 13 мая 2015
public class RandomGenerator {
          private static SecureRandom prng;
          private static final Logger LOG = LoggerFactory
                    .getLogger(AuthTokenGenerator.class);
            static {
                try {
                    // Initialize SecureRandom
                    prng = SecureRandom.getInstance("SHA1PRNG");
                } catch (NoSuchAlgorithmException e) {
                    LOG.info("ERROR while intantiating Secure Random:   " + prng);
            }
        }
        /**
         * @return
         */
        public static String getToken() {
            try {
                LOG.info("About to Generate Token in getToken()");
                String token;
                // generate a random number
                String randomNum = Integer.toString(prng.nextInt());
                // get its digest
                MessageDigest sha = MessageDigest.getInstance("SHA-1");
                byte[] result = sha.digest(randomNum.getBytes());
                token = hexEncode(result);
                LOG.info("Token in getToken():   " + token);
                return token;
            } catch (NoSuchAlgorithmException ex) {
                return null;
            }
        }
        /**
         * @param aInput
         * @return
         */
        private static String hexEncode(byte[] aInput) {
            StringBuilder result = new StringBuilder();
            char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
                    'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
            for (byte b : aInput) {
                result.append(digits[(b & 0xf0) >> 4]);
                result.append(digits[b & 0x0f]);
            }
            return result.toString();
        }
}
0 голосов
/ 08 декабря 2014

Еще одно решение ..

public static String generatePassword(int passwordLength) {
    int asciiFirst = 33;
    int asciiLast = 126;
    Integer[] exceptions = { 34, 39, 96 };

    List<Integer> exceptionsList = Arrays.asList(exceptions);
    SecureRandom random = new SecureRandom();
    StringBuilder builder = new StringBuilder();
    for (int i=0; i<passwordLength; i++) {
        int charIndex;
        do {
            charIndex = random.nextInt(asciiLast - asciiFirst + 1) + asciiFirst;
        }
        while (exceptionsList.contains(charIndex));

        builder.append((char) charIndex);
    }

    return builder.toString();
}
0 голосов
/ 21 января 2013

Вы можете использовать эту простую функцию Java:

 public class GenerateRandomString {
   private static final String ALPHA_NUM =
           "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   public static void main(String[] args) {
      GenerateRandomString grs = new GenerateRandomString();
      System.out.println(grs.getAlphaNumeric(10));
      System.out.println(grs.getAlphaNumeric(20));
   }
   public String getAlphaNumeric(int len) {
      StringBuffer sb = new StringBuffer(len);
      for (int i=0;  i<len;  i++) {
         int ndx = (int)(Math.random()*ALPHA_NUM.length());
         sb.append(ALPHA_NUM.charAt(ndx));
      }
      return sb.toString();
   }
}
0 голосов
/ 22 августа 2014
/**
    Generate a random String with maxlength random
    characters found in the ASCII table between 33
    and 122 (so it contains every lowercase / uppercase
    letters, numbers and some others characters
*/
public static String GetRandomString(int maxlength)
{
    String result = "";
    int i = 0, n = 0, min = 33, max = 122;
    while(i < maxlength)
    {
        n = (int)(Math.random() * (max - min) + min);
        if(n >= 33 && n < 123)
        {
            result += (char)n;
            ++i;
        }
    }
    return(result);
}
0 голосов
/ 26 февраля 2014

Вы можете сделать это трудным путем:

package gaming;

import java.util.Random;

public class game2 {

public static char c;
public static Random r = new Random();
public static int i = r.nextInt(25);
public static int i2 = r.nextInt(25);
public static int i3 = r.nextInt(25);
public static int i4= r.nextInt(25);
public static int i5 = r.nextInt(25);
public static int num2 = r.nextInt(9);
public static int num3= r.nextInt(9);
public static String s1 = String.valueOf(num2);
public static String s2 = String.valueOf(num3);

public static void main(String[] args){


    System.out.print("The pin is: ");
    changeToString(i);
    System.out.print(c);
    changeToString(i2);
    System.out.print(c);
    changeToString(i3);
    System.out.print(c);
    changeToString(i4);
    System.out.print(c);
    changeToString(i5);
    System.out.print(c);
    System.out.print(s1);
    System.out.print(s2);

}

public static void changeToString(int rand){

    switch (rand){

    case 0:

        c = 'A';
        break;
    case 1:

        c = 'B';
        break;
    case 2:

        c = 'C';
        break;
    case 3:

        c = 'D';
        break;
    case 4:

        c = 'E';
        break;
    case 5:

        c = 'F';
        break;
    case 6:

        c = 'G';
        break;
    case 7:

        c = 'H';
        break;
    case 8:

        c = 'I';
        break;
    case 9:

        c = 'J';
        break;
    case 10:

        c = 'K';
        break;
    case 11:

        c = 'L';
        break;
    case 12:

        c = 'M';
        break;
    case 13:

        c = 'N';
        break;
    case 14:

        c = 'O';
        break;
    case 15:

        c = 'P';
        break;
    case 16:

        c = 'Q';
        break;
    case 17:

        c = 'R';
        break;
    case 18:

        c = 'S';
        break;
    case 19:

        c = 'T';
        break;
    case 20:

        c = 'U';
        break;
    case 21:

        c = 'V';
        break;
    case 22:

        c = 'W';
        break;
    case 23:

        c = 'X';
        break;
    case 24:

        c = 'Y';
        break;
    case 25:

        c = 'Z';
        break;

    }

}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...