【发布时间】:2013-09-10 19:05:33
【问题描述】:
我想生成随机的唯一 ID,例如(使用 Perl);
XYZ2345672、ABC0098321、LMN_G8732415
模式是
<prefix><[0-9]{7}>
我有 5 个这样的前缀。 ID 应通过数据库中的唯一约束。我该怎么办? 谢谢
【问题讨论】:
标签: perl random uniqueidentifier postgresql-9.2
我想生成随机的唯一 ID,例如(使用 Perl);
XYZ2345672、ABC0098321、LMN_G8732415
模式是
<prefix><[0-9]{7}>
我有 5 个这样的前缀。 ID 应通过数据库中的唯一约束。我该怎么办? 谢谢
【问题讨论】:
标签: perl random uniqueidentifier postgresql-9.2
例如
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,那么您应该使用相应的模块。
【讨论】:
$seen->{$id} = 1; 和 exists 可以删除。
exists 理论上更便宜。
exists是在调用函数吗?
exists 是一个操作符,有自己的操作码。无论如何,我对它进行了基准测试,当元素不存在时,exists 的输出速度提高了 5%,否则它们在速度方面是相同的。
试试这个,
{
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";
【讨论】: