带有PostgreSQL命名空间的随机唯一标识符

时间:2013-09-10 19:05:34

标签: perl random uniqueidentifier postgresql-9.2

我想生成随机唯一ID,如(使用Perl);  XYZ2345672ABC0098321LMN_G8732415

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

我有5个这样的前缀。 ID应该在数据库中传递唯一约束。我怎么能这样做? 感谢

3 个答案:

答案 0 :(得分:1)

  1. 创建新ID
  2. 检查是否已创建此ID(如果是,请重复)。
  3. E.g。

    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,那么你应该使用相应的模块。

答案 1 :(得分: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";

答案 2 :(得分: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";