Algorithm

To generate a random string, concatenate characters drawn randomly from the set of acceptable symbols until the string reaches the desired length.

Implementation

Here's some fairly simple and very flexible code for generating random identifiers. Read the information that follows for important application notes.

public class RandomString {

    /**
     * Generate a random string.
     */
    public String nextString() {
        for (int idx = 0; idx < buf.length; ++idx)
            buf[idx] = symbols[random.nextInt(symbols.length)];
        return new String(buf);
    }

    public static final String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    public static final String lower = upper.toLowerCase(Locale.ROOT);

    public static final String digits = "0123456789";

    public static final String alphanum = upper + lower + digits;

    private final Random random;

    private final char[] symbols;

    private final char[] buf;

    public RandomString(int length, Random random, String symbols) {
        if (length < 1) throw new IllegalArgumentException();
        if (symbols.length() < 2) throw new IllegalArgumentException();
        this.random = Objects.requireNonNull(random);
        this.symbols = symbols.toCharArray();
        this.buf = new char[length];
    }

    /**
     * Create an alphanumeric string generator.
     */
    public RandomString(int length, Random random) {
        this(length, random, alphanum);
    }

    /**
     * Create an alphanumeric strings from a secure generator.
     */
    public RandomString(int length) {
        this(length, new SecureRandom());
    }

    /**
     * Create session identifiers.
     */
    public RandomString() {
        this(21);
    }

}

Usage examples

Create an insecure generator for 8-character identifiers:

RandomString gen = new RandomString(8, ThreadLocalRandom.current());

Create a secure generator for session identifiers:

RandomString session = new RandomString();

Create a generator with easy-to-read codes for printing. The strings are longer than full alphanumeric strings to compensate for using fewer symbols:

String easy = RandomString.digits + "ACEFGHJKLMNPQRUVWXYabcdefhijkprstuvwx";
RandomString tickets = new RandomString(23, new SecureRandom(), easy);

Use as session identifiers

Generating session identifiers that are likely to be unique is not good enough, or you could just use a simple counter. Attackers hijack sessions when predictable identifiers are used.

There is tension between length and security. Shorter identifiers are easier to guess, because there are fewer possibilities. But longer identifiers consume more storage and bandwidth. A larger set of symbols helps, but might cause encoding problems if identifiers are included in URLs or re-entered by hand.

The underlying source of randomness, or entropy, for session identifiers should come from a random number generator designed for cryptography. However, initializing these generators can sometimes be computationally expensive or slow, so effort should be made to re-use them when possible.

Use as object identifiers

Not every application requires security. Random assignment can be an efficient way for multiple entities to generate identifiers in a shared space without any coordination or partitioning. Coordination can be slow, especially in a clustered or distributed environment, and splitting up a space causes problems when entities end up with shares that are too small or too big.

Identifiers generated without taking measures to make them unpredictable should be protected by other means if an attacker might be able to view and manipulate them, as happens in most web applications. There should be a separate authorization system that protects objects whose identifier can be guessed by an attacker without access permission.

Care must be also be taken to use identifiers that are long enough to make collisions unlikely given the anticipated total number of identifiers. This is referred to as "the birthday paradox." The probability of a collision, p, is approximately n2/(2qx), where n is the number of identifiers actually generated, q is the number of distinct symbols in the alphabet, and x is the length of the identifiers. This should be a very small number, like 2โ€‘50 or less.

Working this out shows that the chance of collision among 500k 15-character identifiers is about 2โ€‘52, which is probably less likely than undetected errors from cosmic rays, etc.

Comparison with UUIDs

According to their specification, UUIDs are not designed to be unpredictable, and should not be used as session identifiers.

UUIDs in their standard format take a lot of space: 36 characters for only 122 bits of entropy. (Not all bits of a "random" UUID are selected randomly.) A randomly chosen alphanumeric string packs more entropy in just 21 characters.

UUIDs are not flexible; they have a standardized structure and layout. This is their chief virtue as well as their main weakness. When collaborating with an outside party, the standardization offered by UUIDs may be helpful. For purely internal use, they can be inefficient.

Top answer
1 of 16
1642

Algorithm

To generate a random string, concatenate characters drawn randomly from the set of acceptable symbols until the string reaches the desired length.

Implementation

Here's some fairly simple and very flexible code for generating random identifiers. Read the information that follows for important application notes.

public class RandomString {

    /**
     * Generate a random string.
     */
    public String nextString() {
        for (int idx = 0; idx < buf.length; ++idx)
            buf[idx] = symbols[random.nextInt(symbols.length)];
        return new String(buf);
    }

    public static final String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    public static final String lower = upper.toLowerCase(Locale.ROOT);

    public static final String digits = "0123456789";

    public static final String alphanum = upper + lower + digits;

    private final Random random;

    private final char[] symbols;

    private final char[] buf;

    public RandomString(int length, Random random, String symbols) {
        if (length < 1) throw new IllegalArgumentException();
        if (symbols.length() < 2) throw new IllegalArgumentException();
        this.random = Objects.requireNonNull(random);
        this.symbols = symbols.toCharArray();
        this.buf = new char[length];
    }

    /**
     * Create an alphanumeric string generator.
     */
    public RandomString(int length, Random random) {
        this(length, random, alphanum);
    }

    /**
     * Create an alphanumeric strings from a secure generator.
     */
    public RandomString(int length) {
        this(length, new SecureRandom());
    }

    /**
     * Create session identifiers.
     */
    public RandomString() {
        this(21);
    }

}

Usage examples

Create an insecure generator for 8-character identifiers:

RandomString gen = new RandomString(8, ThreadLocalRandom.current());

Create a secure generator for session identifiers:

RandomString session = new RandomString();

Create a generator with easy-to-read codes for printing. The strings are longer than full alphanumeric strings to compensate for using fewer symbols:

String easy = RandomString.digits + "ACEFGHJKLMNPQRUVWXYabcdefhijkprstuvwx";
RandomString tickets = new RandomString(23, new SecureRandom(), easy);

Use as session identifiers

Generating session identifiers that are likely to be unique is not good enough, or you could just use a simple counter. Attackers hijack sessions when predictable identifiers are used.

There is tension between length and security. Shorter identifiers are easier to guess, because there are fewer possibilities. But longer identifiers consume more storage and bandwidth. A larger set of symbols helps, but might cause encoding problems if identifiers are included in URLs or re-entered by hand.

The underlying source of randomness, or entropy, for session identifiers should come from a random number generator designed for cryptography. However, initializing these generators can sometimes be computationally expensive or slow, so effort should be made to re-use them when possible.

Use as object identifiers

Not every application requires security. Random assignment can be an efficient way for multiple entities to generate identifiers in a shared space without any coordination or partitioning. Coordination can be slow, especially in a clustered or distributed environment, and splitting up a space causes problems when entities end up with shares that are too small or too big.

Identifiers generated without taking measures to make them unpredictable should be protected by other means if an attacker might be able to view and manipulate them, as happens in most web applications. There should be a separate authorization system that protects objects whose identifier can be guessed by an attacker without access permission.

Care must be also be taken to use identifiers that are long enough to make collisions unlikely given the anticipated total number of identifiers. This is referred to as "the birthday paradox." The probability of a collision, p, is approximately n2/(2qx), where n is the number of identifiers actually generated, q is the number of distinct symbols in the alphabet, and x is the length of the identifiers. This should be a very small number, like 2โ€‘50 or less.

Working this out shows that the chance of collision among 500k 15-character identifiers is about 2โ€‘52, which is probably less likely than undetected errors from cosmic rays, etc.

Comparison with UUIDs

According to their specification, UUIDs are not designed to be unpredictable, and should not be used as session identifiers.

UUIDs in their standard format take a lot of space: 36 characters for only 122 bits of entropy. (Not all bits of a "random" UUID are selected randomly.) A randomly chosen alphanumeric string packs more entropy in just 21 characters.

UUIDs are not flexible; they have a standardized structure and layout. This is their chief virtue as well as their main weakness. When collaborating with an outside party, the standardization offered by UUIDs may be helpful. For purely internal use, they can be inefficient.

2 of 16
903

Java supplies a way of doing this directly. If you don't want the dashes, they are easy to strip out. Just use uuid.replace("-", "")

import java.util.UUID;

public class randomStringGenerator {
    public static void main(String[] args) {
        System.out.println(generateString());
    }

    public static String generateString() {
        String uuid = UUID.randomUUID().toString();
        return "uuid = " + uuid;
    }
}

Output

uuid = 2d7428a6-b58c-4008-8575-f05549f16316
๐ŸŒ
Blogger
javarevisited.blogspot.com โ€บ 2021 โ€บ 05 โ€บ 3-examples-to-generate-random-alphanumeric-string-in-java0.html
3 Examples to Generate Random Alphanumeric String in Java - UUID Example
May 3, 2021 - Another way to generate random Strings in Java both alphanumeric and numeric is to use the Math.random() class just like we used it for generating random numbers and pick a random character from a defined character set like a set of uppercase ...
๐ŸŒ
Java67
java67.com โ€บ 2018 โ€บ 01 โ€บ how-to-create-random-alphabetic-or-alphanumeric-string-java.html
How to Create Random Alphabetic or AlphaNumeric String of given length in Java? SecureRandom Example | Java67
Now, if you want an alphanumeric String of a given length instead of an alphabetic string then you just need to change the SOURCE string to include numbers or digits e.g from 0 to 0 as shown below:
๐ŸŒ
GeeksforGeeks
geeksforgeeks.org โ€บ java โ€บ generate-random-string-of-given-size-in-java
Generate random String of given size in Java - GeeksforGeeks
July 11, 2025 - Below example generates a random String of LowerCase letters of size n. Below is the implementation of the above approach: ... // Java program generate a random AlphaNumeric String // using CharSet method import java.util.*; import ...
๐ŸŒ
Educative
educative.io โ€บ answers โ€บ what-is-randomstringutilsrandomalphanumeric-in-java
What is RandomStringUtils.randomAlphanumeric() in Java?
the methods in Java that can be called without creating an object of the class. method of the RandomStringUtils class that is used to generate random strings consisting of alphanumeric characters.
๐ŸŒ
Coderanch
coderanch.com โ€บ t โ€บ 372158 โ€บ java โ€บ Generating-random-alphanumeric-strings
Generating random alphanumeric strings. (Java in General forum at Coderanch)
You can convert this int n to a character: Then just put six of these in a StringBuffer, and you've got a random ID. If you need to make sure no ID is ever repeated, you could add a HashSet which stores all the IDs used so far, and check each new random ID to see if it's in the set.
๐ŸŒ
Delft Stack
delftstack.com โ€บ home โ€บ howto โ€บ java โ€บ random alphanumeric string in java
How to Generate Random String in Java | Delft Stack
April 18, 2018 - class AlphaNumericStringGenerator { static String getRandomString(int i) { String theAlphaNumericS; StringBuilder builder; theAlphaNumericS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789"; // create the StringBuffer builder = new StringBuilder(i); for (int m = 0; m < i; m++) { // generate numeric int myindex = (int) (theAlphaNumericS.length() * Math.random()); // add the characters builder.append(theAlphaNumericS.charAt(myindex)); } return builder.toString(); } public static void main(String[] args) { // the random string length int i = 15; // output System.out.println("A random string: " + getRandomString(i)); } } ... We use the Charset, which is in the java.nio.charset package. A charset stands for character set and represents a mapping between characters and numbers. The process of creating an alphanumeric string using Charset is explained below.
๐ŸŒ
Our Code World
ourcodeworld.com โ€บ articles โ€บ read โ€บ 964 โ€บ how-to-generate-random-alphanumeric-strings-with-a-custom-length-in-java
How to generate random alphanumeric strings with a custom length in Java | Our Code World
June 14, 2019 - In order to generate a random string with a custom implementation, you can use the following method as helper in your own project: import java.security.SecureRandom; /** * This method returns a random string generated with SecureRandom * * @param length * @return */ public static String generateRandomString(int length) { // You can customize the characters that you want to add into // the random strings String CHAR_LOWER = "abcdefghijklmnopqrstuvwxyz"; String CHAR_UPPER = CHAR_LOWER.toUpperCase(); String NUMBER = "0123456789"; String DATA_FOR_RANDOM_STRING = CHAR_LOWER + CHAR_UPPER + NUMBER; S
Find elsewhere
Top answer
1 of 4
7
for
        (double i = 0; i < length; i++)

And related loops should have the "for" on the same line (as this is a common coding convention.)

(randroll <= (1.0 / 36.0 * j))

This doesn't have to be a double; instead, the random number can be generated as an integer (to select which element from the array.)

randchar = '@';

Unless the random string is not random, I would not initialize the variables with sample data. I'd just leave them blank and then adjust the loop to always run at least once (a do-while loop) so that it becomes initialized.

for
            (int j = 1; j <= 36; j++)
            {
                if
                (randroll <= (1.0 / 36.0 * j))
                {
                    randchar = charstring.charAt(j - 1);
                    break;
                }
            }

I would remove the inner if-statement and un-hardcode the values so it can work with strings with any size. Applying these suggestions, it can be simplified to:

import java.util.Random;
class Main {
  public static void main(String[] args) {
    int strLen = 100;
    String randString = "";
    Random r = new Random();
    String[] chars = "abcdefghijklmnopqrstuvwxyz0123456789".split("");
    while (randString.length() < strLen)
        randString += chars[randBetween(r, 0, chars.length - 1)];

    System.out.println(randString);
  }

  /*
  Generates a random number from min to max inclusive
  */
  public static int randBetween(Random r, int min, int max) {
    return r.nextInt((max - min) + 1) + min;
  }
}

This approach is not optimal as the string is constantly being appended to, meaning that the string has to be re-copied every iteration.

Java introduced Streams, which allows reading forever from certain generators. Knowing this, we can read a stream of random numbers up until the string length that the user wants, and then get the character at the random string length:

import java.util.Random;
class Main {
  public static void main(String[] args) {
    int strLen = 100;
    String chars = "abcdefghijklmnopqrstuvwxyz0123456789";

    StringBuilder randomOutput = new StringBuilder();
    new Random().ints(strLen, 0, chars.length())
                .forEach(c -> randomOutput.append(chars.charAt(c)));

    System.out.println(randomOutput);
  }
}

StringBuilder is used to append the random character as it doesn't have to be re-copied for every loop iteration.

2 of 4
6

Separate random generator

I would either extract the random number generator into an extra method, or simply use new Random().nextInt(36) from package java.util to generate a random integer between 0 and 35 (both inclusive).

You could also make the method more generic by adding boundary parameters (min, max). So you can reuse within other limitations.

See: Math.random() explanation

Variable names

Typical Java convention would name things using Camel-case. Also following Cleancode would put as much meaning into their names.

So variables (except simple loop counters) can be renamed:

  • characterOptions or possibleCharacters or alphaNumericChars
  • randomCharacterChoice or randomCharIndex
  • randomString or randomAlphaNumericSequence
๐ŸŒ
Xperti
xperti.io โ€บ home โ€บ generate random string in java
Easiest Ways To Generate A Random String In Java
May 9, 2022 - This function also takes an integer as an argument and returns a numeric string of that length. It returns a random alphanumeric string consisting of upper case, lower case and digits.
๐ŸŒ
Programiz
programiz.com โ€บ java-programming โ€บ examples โ€บ generate-random-string
Java Program to Create random strings
import java.util.Random; class Main { public static void main(String[] args) { // create a string of all characters String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // create random string builder StringBuilder sb = new StringBuilder(); // create an object of Random class Random random = new ...
๐ŸŒ
CodeJava
codejava.net โ€บ coding โ€บ generate-random-strings-examples
Generate Random Strings in Java Examples
January 13, 2023 - First we define a String object alphanumericCharacters that contains all letters and numbers. Then we generate a random String with each character is randomly chosen from the predefined set.
๐ŸŒ
W3Schools Blog
w3schools.blog โ€บ home โ€บ how to create random alphanumeric in java?
How to create random alphanumeric in java? - W3Schools.blog
October 1, 2024 - package com.w3schools; import java.util.Random; public class Test { private static final String CHAR_LIST = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; private static final int RANDOM_STRING_LENGTH = 10; public String randomString(){ StringBuffer randomString = new StringBuffer(); for(int i=0; i<RANDOM_STRING_LENGTH; i++){ int number = getRandomNumber(); char ch = CHAR_LIST.charAt(number); randomString.append(ch); } return randomString.toString(); } private int getRandomNumber() { int randomInt = 0; Random randomGenerator = new Random(); randomInt = randomGenerator.nextInt(CHAR_LIST.length()); if (randomInt - 1 == -1) { return randomInt; } else { return randomInt - 1; } } public static void main(String args[]){ Test test = new Test(); for(int i = 0; i < 10 ; i++){ System.out.println(test.randomString()); } } }
๐ŸŒ
Quickprogrammingtips
quickprogrammingtips.com โ€บ java โ€บ random-alphanumeric-generator-in-java.html
Random Alphanumeric Generator in Java
It is also possible to specify a subset of character set in the random string by modifying the CHARACTER_SET variable. import java.security.SecureRandom; // Example - Random alphanumeric generator in Java public class RandomAlphaNumericGenerator { private static SecureRandom random = new SecureRandom(); private static final String CHARACTER_SET="0123456789abcdefghijklmnopqrstuvwxyz"; public static void main(String[] args) { System.out.println("Random Alphanumeric String:"+getRandomString(32)); } // Create a random alphanumeric string private static String getRandomString(int len) { StringBuffer buff = new StringBuffer(len); for(int i=0;i<len;i++) { int offset = random.nextInt(CHARACTER_SET.length()); buff.append(CHARACTER_SET.substring(offset,offset+1)); } return buff.toString(); } }
๐ŸŒ
Reactgo
reactgo.com โ€บ java-generate-alphanumeric-string
How to generate the random alphanumeric string in Java | Reactgo
August 9, 2012 - // Java program public class RandomString { static String getAlphaNumericString(int n) { String AlphaNumericString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789" + "abcdefghijklmnopqrstuvxyz"; StringBuilder sb = new StringBuilder(n); for (int ...
๐ŸŒ
Mkyong
mkyong.com โ€บ home โ€บ java โ€บ java โ€“ how to generate a random string
Java - How to generate a random String - Mkyong.com
July 30, 2020 - Generate a random String of 32 alphanumeric characters (hexadecimal) and 4 hyphens, read this UUID format ... package com.mkyong; import java.util.UUID; public class UUIDExample { public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println(generateRandomStringByUUIDNoDash()); } for (int i = 0; i < 10; i++) { System.out.println(generateRandomStringByUUIDNoDash()); } } public static String generateRandomStringByUUID() { return UUID.randomUUID().toString(); } public static String generateRandomStringByUUIDNoDash() { return UUID.randomUUID().toString().replace("-", ""); } }
๐ŸŒ
Medium
medium.com โ€บ @oshanilakchani โ€บ generating-random-alphanumeric-strings-in-java-four-essential-approaches-for-automation-6aad520aeb04
๐Ÿš€Generating Random Alphanumeric Strings in Java: Four Essential Approaches for Automation.โœจ๐Ÿ’ป๐ŸŒ๐ŸŒŸ | by Oshani Lakchani | Feb, 2026 | Medium
February 10, 2026 - ... import java.security.SecureRandom; public class Main { public static void main(String[] args) { int reqLength = 10; String alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; StringBuilder reqString = new ...
๐ŸŒ
Java Lessons
javalessons.com โ€บ home โ€บ blog โ€บ generating random strings: detailed explanation
Java Generating Random Strings: Step-By-Step Guide
August 20, 2023 - You can remove the hyphens to get a 32-character alphanumeric string. ... The Apache Commons Lang library provides the RandomStringUtils class, which offers various methods to generate random strings of different types.
๐ŸŒ
codippa
codippa.com โ€บ home โ€บ how to generate random string in java / 4 ways to generate random string in java
How to generate random string in java / 4 ways to generate random string in java - codippa
December 7, 2019 - Random string of 10 alphabets: OEfadIYfFm Random string of 10 numbers: 1639479195 Random string of 10 alphanumeric characters: wTQRMXrNY9