How can I generate a 6 digit unique number?

PhpRandom

Php Problem Overview


How can I generate a 6 digit unique number? I have verification mechanisms in place to check for duplicate entries.

Php Solutions


Solution 1 - Php

$six_digit_random_number = random_int(100000, 999999);

As all numbers between 100,000 and 999,999 are six digits, of course.

Solution 2 - Php

If you want it to start at 000001 and go to 999999:

$num_str = sprintf("%06d", mt_rand(1, 999999));

Mind you, it's stored as a string.

Solution 3 - Php

Another one:

str_pad(mt_rand(0, 999999), 6, '0', STR_PAD_LEFT);

Anyway, for uniqueness, you will have to check that your number hasn't been already used.

You tell that you check for duplicates, but be cautious since when most numbers will be used, the number of "attempts" (and therefore the time taken) for getting a new number will increase, possibly resulting in very long delays & wasting CPU resources.

I would advise, if possible, to keep track of available IDs in an array, then randomly choose an ID among the available ones, by doing something like this (if ID list is kept in memory):

$arrayOfAvailableIDs = array_map(function($nb) {
    return str_pad($nb, 6, '0', STR_PAD_LEFT);
}, range(0, 999999));

$nbAvailableIDs = count($arrayOfAvailableIDs);

// pick a random ID

$newID = array_splice($arrayOfAvailableIDs, mt_rand(0, $nbAvailableIDs-1), 1);
$nbAvailableIDs--;

You can do something similar even if the ID list is stored in a database.

Solution 4 - Php

There are some great answers, but many use functions that are flagged as not cryptographically secure. If you want a random 6 digit number that is cryptographically secure you can use something like this:

$key = random_int(0, 999999);
$key = str_pad($key, 6, 0, STR_PAD_LEFT);
return $key;

This will also include numbers like 000182 and others that would otherwise be excluded from the other examples.

You can also use a loop to make each digit random and generate random number with as many digits as you may need:

function generateKey($keyLength) {
    // Set a blank variable to store the key in
    $key = "";
    for ($x = 1; $x <= $keyLength; $x++) {
        // Set each digit
        $key .= random_int(0, 9);
    }
    return $key;
}

For reference, random_int — Generates cryptographically secure pseudo-random integers that are suitable for use where unbiased results are critical, such as when shuffling a deck of cards for a poker game." - php.net/random_int

Solution 5 - Php

Here's another one:

substr(number_format(time() * rand(),0,'',''),0,6);

Solution 6 - Php

<?php
$file = 'count.txt';

//get the number from the file
$uniq = file_get_contents($file);

//add +1
$id = $uniq + 1 ;

// add that new value to text file again for next use
file_put_contents($file, $id);

// your unique id ready
echo $id;
?>

i hope this will work fine. i use the same technique in my website.

Solution 7 - Php

In PHP 7.0+ I would suggest random_int($min, $max) over mt_rand().

$randomSixDigitInt = \random_int(100000, 999999);

From php.net:

>Caution This function does not generate cryptographically secure values, and should not be used for cryptographic purposes. If you need a cryptographically secure value, consider using random_int(), random_bytes(), or openssl_random_pseudo_bytes() instead.

So this depends mostly on context. I'll also add that as of PHP 7.1.0 rand() is now an alias to mt_rand().

Cheers

Solution 8 - Php

$characters = '123456789';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < 6; $i++) {
    $randomString .= $characters[rand(0, $charactersLength - 1)];
}
$pin=$randomString; 

Solution 9 - Php

This will generate random 6 digit number

<?php
    mt_rand(100000,999999);
?>

Solution 10 - Php

I would use an algorithm, brute force could be as follows:

First time through loop: Generate a random number between 100,000 through 999,999 and call that x1

Second time through the loop Generate a random number between 100,000 and x1 call this xt2, then generate a random number between x1 and 999,999 call this xt3, then randomly choose x2 or x3, call this x2

Nth time through the loop Generate random number between 100,000 and x1, x1 and x2, and x2 through 999,999 and so forth...

watch out for endpoints, also watch out for x1

Solution 11 - Php

<?php echo rand(100000,999999); ?>

you can generate random number

Solution 12 - Php

You can use $uniq = round(microtime(true));

it generates 10 digit base on time which is never be duplicated

Solution 13 - Php

Try this using uniqid and hexdec,

echo hexdec(uniqid());

Solution 14 - Php

Among the answers given here before this one, the one by "Yes Barry" is the most appropriate one.

random_int(100000, 999999)

Note that here we use random_int, which was introduced in PHP 7 and uses a cryptographic random generator, something that is important if you want random codes to be hard to guess. random_bytes was also introduced in PHP 7 and likewise uses a cryptographic random generator.

Many other solutions for random value generation, including those involving time(), microtime(), uniqid(), rand(), mt_rand(), str_shuffle(), array_rand(), and shuffle(), are much more predictable and are unsuitable if the random string will serve as a password, a bearer credential, a nonce, a session identifier, a "verification code" or "confirmation code", or another secret value.

The code above generates a string of 6 decimal digits. If you want to use a bigger character set (such as all upper-case letters, all lower-case letters, and the 10 digits), this is a more involved process, but you have to use random_int or random_bytes rather than rand(), mt_rand(), str_shuffle(), etc., if the string will serve as a password, a "confirmation code", or another secret value. See an answer to a related question, and see also: https://stackoverflow.com/questions/4570980/generating-a-random-code-in-php/64472183#64472183

I also list other things to keep in mind when generating unique identifiers, especially random ones.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAAAView Question on Stackoverflow
Solution 1 - PhpCharlesView Answer on Stackoverflow
Solution 2 - PhpTim CooperView Answer on Stackoverflow
Solution 3 - PhpFrosty ZView Answer on Stackoverflow
Solution 4 - PhpMav2287View Answer on Stackoverflow
Solution 5 - Phplaw.vzmkView Answer on Stackoverflow
Solution 6 - PhpvirusView Answer on Stackoverflow
Solution 7 - PhpYes BarryView Answer on Stackoverflow
Solution 8 - PhpTHEMBO CHARLES LWANGAView Answer on Stackoverflow
Solution 9 - PhpAnanta PrasadView Answer on Stackoverflow
Solution 10 - Phprossb83View Answer on Stackoverflow
Solution 11 - PhpManjeet Kumar NaiView Answer on Stackoverflow
Solution 12 - PhpTon CmanView Answer on Stackoverflow
Solution 13 - PhpJONView Answer on Stackoverflow
Solution 14 - PhpPeter O.View Answer on Stackoverflow