【问题标题】:Random unique identifiers with namespace for PostgreSQLPostgreSQL 命名空间的随机唯一标识符
【发布时间】:2013-09-10 19:05:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: perl random uniqueidentifier postgresql-9.2


    【解决方案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,那么您应该使用相应的模块。

    【讨论】:

    • $seen->{$id} = 1;exists 可以删除。
    • @mapeec 使用exists 理论上更便宜。
    • 使用exists是在调用函数吗?
    • @mpapec 我不明白。 exists 是一个操作符,有自己的操作码。无论如何,我对它进行了基准测试,当元素不存在时,exists 的输出速度提高了 5%,否则它们在速度方面是相同的。
    • tnx 获取信息;所以在内部它是一个运算符?
    【解决方案2】:

    试试这个,

    { 
    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";
    

    【讨论】:

      【解决方案3】:

      当然,(至少)有一个 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";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-12
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-07
        相关资源
        最近更新 更多