1

我想生成随机的唯一 ID,例如(使用 Perl); XYZ2345672, ABC0098321,LMN_G8732415

模式是 <prefix><[0-9]{7}>

我有 5 个这样的前缀。ID 应该通过数据库中的唯一约束。我该怎么办?谢谢

4

3 回答 3

1
  1. 创建一个新的 ID
  2. 检查此 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,那么您应该使用一些模块。

于 2013-09-10T19:12:48.230 回答
1

尝试这个,

{ 
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";
于 2013-09-10T19:13:58.570 回答
0

当然,(至少)有一个 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";
于 2013-09-10T21:20:16.543 回答