Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation

Re^8: Generate a unique ID

by BrowserUk (Pope)
on Nov 17, 2010 at 17:58 UTC ( #872028=note: print w/ replies, xml ) Need Help??

in reply to Re^7: Generate a unique ID
in thread Generate a unique ID

Hm. With 52 choices for the first character and 62 thereafter, a 4 character is capable of producing 52 * 62**3 different strings:12,393,056

And yet:

C:\test>junk 4 57147Dup after 57283 reps at C:\test\ line 18. 57283 C:\test>junk 4 51003Dup after 51478 reps at C:\test\ line 18. 51478 C:\test>junk 4 2Dup after 23961 reps at C:\test\ line 18. 23961 C:\test>junk 4 4Dup after 44858 reps at C:\test\ line 18. 44858

A tiny part of that is explainable by your using rand( $#array ) instead of rand( @array ) and therefore never picking the final character in those array, giving 51 * 61**3 := 11576031. But the earlyness of the repeat--as low a 24,000--is way too early to be explained even by the Birthday paradox.

Minorly tweaked version of your code used above:

#! perl -slw use strict; sub random_string { my $n = shift; my $result = ''; my @letters = ('A'..'Z', 'a'..'z'); my @letternum = ('A'..'Z', 'a'..'z', '0'..'9'); $result .= $letters[ rand $#letters ]; $result .= join "", map { $letternum[ rand $#letternum ] } 1..$n; return $result; } my %h; printf("\r$_"), $h{ random_string( $ARGV[0] ) }++ and die "Dup after $ +_ reps" for 1 .. 1e6;

Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
Comment on Re^8: Generate a unique ID
Select or Download Code

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://872028]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (4)
As of 2016-05-25 06:03 GMT
Find Nodes?
    Voting Booth?