我想生成随机的唯一 ID,例如(使用 Perl);
XYZ2345672
, ABC0098321
,LMN_G8732415
模式是
<prefix><[0-9]{7}>
我有 5 个这样的前缀。ID 应该通过数据库中的唯一约束。我该怎么办?谢谢
我想生成随机的唯一 ID,例如(使用 Perl);
XYZ2345672
, ABC0098321
,LMN_G8732415
模式是
<prefix><[0-9]{7}>
我有 5 个这样的前缀。ID 应该通过数据库中的唯一约束。我该怎么办?谢谢
例如
use 5.010;
sub new_id_for_prefix {
my $prefix = shift;
state $seen = {};
my $id;
do { $id = $prefix . int rand(1E7) } while exists $seen->{$id};
$seen->{$id} = undef;
return $id;
}
say new_id_for_prefix("foo") for 1..5;
示例输出:
foo2533460
foo1633946
foo6099891
foo8084746
foo4358492
如果您想要 UID/GUID,那么您应该使用一些模块。
尝试这个,
{
my %uniq;
sub get_random_id {
my ($prefix, $digits) = @_;
my $ret;
do {
$ret = $prefix . join "", map { int rand(10) } 1 .. $digits;
}
while $uniq{$ret}++;
return $ret;
}}
print get_random_id("ABC", 7), "\n";
当然,(至少)有一个 CPAN 模块可以做到这一点。String::Random
允许您根据模式生成随机字符串,还允许您定义自己的自定义模式。下面的示例为自定义P
模式定义了一个包含五个可能字符串的数组。n
是预定义的,并被随机数字替换:
use String::Random;
my $rand = String::Random->new;
$rand->{P} = ["prefixA","prefixB","prefixC","prefixD","prefixE"];
print $rand->randpattern("Pnnnnnnn"), "\n";