Skip to content

Instantly share code, notes, and snippets.

@earthgecko
Last active October 16, 2024 20:10
Show Gist options
  • Save earthgecko/3089509 to your computer and use it in GitHub Desktop.
Save earthgecko/3089509 to your computer and use it in GitHub Desktop.
shell/bash generate random alphanumeric string
#!/bin/bash
# bash generate random alphanumeric string
#
# bash generate random 32 character alphanumeric string (upper and lowercase) and
NEW_UUID=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)
# bash generate random 32 character alphanumeric string (lowercase only)
cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 32 | head -n 1
# Random numbers in a range, more randomly distributed than $RANDOM which is not
# very random in terms of distribution of numbers.
# bash generate random number between 0 and 9
cat /dev/urandom | tr -dc '0-9' | fold -w 256 | head -n 1 | head --bytes 1
# bash generate random number between 0 and 99
NUMBER=$(cat /dev/urandom | tr -dc '0-9' | fold -w 256 | head -n 1 | sed -e 's/^0*//' | head --bytes 2)
if [ "$NUMBER" == "" ]; then
NUMBER=0
fi
# bash generate random number between 0 and 999
NUMBER=$(cat /dev/urandom | tr -dc '0-9' | fold -w 256 | head -n 1 | sed -e 's/^0*//' | head --bytes 3)
if [ "$NUMBER" == "" ]; then
NUMBER=0
fi
@NicolasGoeddel
Copy link

base64 should be the best thing you can do. This way no incoming bit will be ignored. tr on the other hand is not the best thing in my opinion. But it also would be a bit more complicated if you always want to make every bit count.

@GCV-Sleeper-Service
Copy link

GCV-Sleeper-Service commented Jan 11, 2022

When generating one or two 10-20 char length strings which method you pick up probably is not that important.

How about putting the question differently - which method would be least resource-intensive and won't require installation of additional tool? Let's imagine you need to generate 5000 strings each 160 char length.

@pier4r
Copy link

pier4r commented Jan 11, 2022

invisible see https://gist.github.com/earthgecko/3089509#gistcomment-3827754 (achieved on a very small footprint OS, openwrt)

@GCV-Sleeper-Service
Copy link

@pier4r Thanks. But what performance would look like compared to other methods?

@pier4r
Copy link

pier4r commented Jan 12, 2022

@invisible999 don't know, one needs to make a benchmark with the various proposed methods (and likely others published elsewhere)

@dagreatpyro22
Copy link

how do i generate the string cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1 but have the first half as dedicated set characters

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment