Nice solution.
Downsides:
- This recreates the 62 element list repeatedly in memory, since there's
no place to store it.
- The number "62" is hardcoded, and must match the list exactly. That's
a maintenance headache: suppose a requirement came along to ensure that
underscore were included, or that digits were not.
- The int is redundant.
Implementing these three changes, I'd go with something like:
BEGIN {
my @source = ('A'..'Z', 'a'..'z', '0'..'9');
sub generate_random_password {
my $id = "";
for (1..18) {
$id .= $source[rand @source];
}
$id;
}
}
For so-called "pronounceable" passwords, try Crypt::RandPasswd. Looks nice, and based on a government standard.
-- Randal L. Schwartz, Perl hacker | [reply] [Watch: Dir/Any] [d/l] |
About your downsides...
1) Yup, I can see capturing the 62-element in a closure instead of re-creating it. I didn't think of that when I was coding off the top of my head.
2) Nice catch
3) Oops... I missed that. I looked in the library to verify the result of rand() and it said it returns a float, not an int. But I guess the [ takes care of that...
Since this is supposed to be a "UniqueID" and not a password, using "pronounceable" passwords are probably not necessary.
Why put it in a BEGIN block? Doesn't seem necessary to me.
| [reply] [Watch: Dir/Any] |
| [reply] [Watch: Dir/Any] |