perl - 如何在 Perl 中创建唯一标识符?

标签 perl uniqueidentifier

我正在为不同用户执行的一些测试结果创建一个面向文件的数据库。为此,我需要为数据库中的每个条目生成唯一 ID。 id 必须满足以下要求:

  • ID 应该相当小(最多 6 个字符)
  • 对于每个测试用例和用户组合,每次都应生成相同的 id

我尝试的是一个简单的 BKDR 哈希函数,种子值为 31,并使用了 ord() 函数,如下所示:

@chars = split(//,$hash_var);

$hash = 0;
$seed = 31;

foreach $char ( @chars ) {
   if( $char !~ m/\d/ ) {
       $hash = ( $seed * $hash ) + ord( $char );
   }  
   else {
       $hash = ( $seed * $hash ) + $char ;
   }
}

$hash = ( $hash & 0x7FFFFFFF ) % 1000;
$hash = "$chars[0]$chars[$#chars]$hash" ;

这有时会导致各种组合的结果相同,即没有观察到唯一性。他们还有其他方法可以做到这一点吗?改变种子值是否有助于实现独特性。

最佳答案

您是否拥有超过 256 个用户和/或每个用户超过 65536 个测试用例?如果没有,您可以只从 0 .. 255 开始索引用户,从 0 .. 65535 开始测试用例,并将其编码为十六进制数字字符串,这样六个字符就可以了。

如果你有更多的用户或测试用例,我会再次索引用户和测试用例,然后将它们组合成一个 32 位整数,实际上只需要 4 个字节,实现起来很简单,但对人类来说稍微困难一些.

无论如何,我假设您已获得用户名和测试用例信息。只需保留两个绑定(bind)的哈希值:%users%cases 将用户和测试用例映射到他们的索引号。

关于perl - 如何在 Perl 中创建唯一标识符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1063364/

相关文章:

linux - 带有重定向输出的 Perl 颜色说明符

perl - 如何在不干扰现有Perl的情况下安装单独的Perl?

java - 在 Java 中生成唯一 ID 的最佳方法

c# - 为什么 asp.net Identity 用户 id 是字符串?

java - java 中的 perl CBC DES 等效项

regex - Perl 正则表达式 dotall 问题

sqlite,在perl中插入数据和特殊字符大小写

neo4j - Neo4j 中所有节点/关系的可靠(自动)递增标识符

MySQL - 为每条记录提供唯一键,而不是主键

java - 如何在java中生成一个5个字符的唯一字母数字值?