Jump to content

generating random codes


ToonMariner

Recommended Posts

Hi guys n gals,

 

I have a requirement to generate 250,000 unique codes...

 

These codes are for a tracking service and will be stored in the database (table field has a unique index).

 

Now I am working on the assumption this must work on the command line as the script will take a long time to complete... here is the salient pat of my code...

 

<?php
...
function appendToCode( &$val , $key , $append )
{
$val	=	$val . $append;
}

$chars		= "ABCDEFGHJKLMNPQRSTUVWXYZ";
$charend	= strlen ( $chars );

$date		= date ( 'md' );

$month = $date[0].$date[1];
$year = $date[2].$date[3];

$datecode	=	$chars[$month] . $chars[$year[0]] . $chars[$year[1]];
$codes		=	array();
$no_codes	=	isset( $_GET['no_codes'] ) ? $_GET['no_codes'] : 250000;
$codecount	=	0;

do
{
for ( $j = $codecount ; $j < $no_codes ; $j++ )
{
	$trackcode = NULL;
	for ( $i = 0 ; $i < 7 ; $i++ )
	{
		$trackcode	.= $chars[rand( 0 , $charend - 1 )];
		echo ( time() - $start ) . PHP_EOL;
	}
	$codes[]	=	$trackcode . $date;

}
//$t	=	count($codes);
//echo 'Codes Generated: ' . $t . PHP_EOL;
//echo 'Last Code: ' . $codes[--$t] . PHP_EOL;

$codes		=	array_unique( $codes );
$codecount	=	count ( $codes );

//echo 'Unique Codes: ' . $codecount . PHP_EOL;
// the following statement prevents infinite loop in dev mode...
if	(
	(time() - $start) > 150
	)
{
	break;
}


} while ( $codecount < ($no_codes) - 1 );
...

The last characters of the code relate to the date - as these codes will only be developed every now and then - not a frequent occurrence and will allow a check on the database to see if codes ending in that 3 character string exist...

 

What I am asking is, is there a more efficient method of performing this operation.

 

Any tips would be most welcome...

 

Cheers peeps

 

Toon xxx

 

Link to comment
https://forums.phpfreaks.com/topic/181107-generating-random-codes/
Share on other sites

Thanks dream west but chr requires a parameter to return a character so I'd simply be changing the source of possible characters in the string with one I have a little less control over (note I omit I and O from the valid characters string to avoid confusion with 1 and 0).

 

I have been playing around with the code and no matter how many random strings I generate the call to array_unique always returns the same number (for 250000 random strings I get 32768 - this seems to be a limit) - Am I missing something?

 

This will produce the codes you need using chr()

 

function password_gen($min=6,$max=6,$id){ /*has a default min value of 6 and maximum value of 6*/
$pwd=""; // to store generated password
for($i=0;$i<rand($min,$max);$i++){
  $num=rand(48,122);
  if(($num >= 97 && $num <= 122))     $pwd.=chr($num);
  else if(($num >= 65 && $num <= 90))  $pwd.=chr($num);
  else if(($num >=48 && $num <= 57))    $pwd.=chr($num);
  else    $i--;
}
return $pwd;
}

echo password_gen(6,6, 12 );

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.