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

25

我想创建一个 唯一标识符 (UniqueId)。是否有函数可供调用,每次使用时都会给我一个新的 ID,并始终具有不同的值?


每当我调用该子程序时,它都会给我一个唯一的ID。 - user2568702
密码哈希?随机数生成器基本上。 - Karthik T
什么是加密哈希? - user2568702
1
也许了解你需要这个是为了什么会有所帮助? - Karthik T
2
@RedCricket 他不是你的对手,别大喊大叫,但要回答问题..哈哈 - backtrack
9个回答

28

使用 Data::UUID 生成唯一标识符:

use Data::UUID;

$ug    = Data::UUID->new;
$uuid1 = $ug->create();   # Or create_str()

使用 $ug->to_string($uuid1); 将其转换为字符串。 - Yasiru G
但请查看 https://github.com/rjbs/Data-UUID/issues/5 和其他问题... 并可能决定使用CPAN上的另一个UUID生成模块。 - Slaven Rezic

9
你可以更好地使用这个。
use UUID::Generator::PurePerl;

sub create_search_id {
    my $this =shift;
    my $args=shift;
    my $ug = UUID::Generator::PurePerl->new();
    my $uuid1 = $ug->generate_v1();
    return $uuid1;
}

从这里您可以了解关于UUID::Generator::PurePerl的信息。

如果我想要连接字符串,我可以在这个函数中实现吗? - user2568702
1
在 $uuid1 中,您可以连接 yup。 - Developer
1
在这段代码中,$this和$args的目的是什么?如果这些变量没有被使用,那么声明它们就没有意义。 - Polar Bear

8

如果您有一些使用模块的限制,并且您正在Linux上运行脚本,您可以使用这个解决方法:

my $uuid = `cat /proc/sys/kernel/random/uuid`;

您无需在系统上安装新软件包即可使用它。

2
稍微打字量多一点,但使用 Perl 函数打开并读取文件肯定比使用外部的 cat 命令更快,例如 $uuid = do { open my $fh, "/proc/sys/kernel/random/uuid" or die $!; scalar <$fh> }; - Slaven Rezic

6

使用Data::GUID是另一种选择

use Data::GUID;
my $guid = Data::GUID->new;
my $uniqueIdString = guid->as_string;

或者

use Data::GUID;
my $uniqueIdString = Data::GUID->new->as_string;

6

值得注意的是,在Windows计算机上,您还可以使用Win32:

use Win32;    
my $guid = Win32::GuidGen();

...它包含在安装在Windows上的Perl中。 - Wolf

1
我将使用Data::Uniqid,该模块有3种方法:
use Data::Uniqid qw ( suniqid uniqid luniqid );
$id = suniqid; #genrates a very short id valid only for the localhost and with a liftime of 1 day
$id = uniqid;  #generates a short id valid on the local host 
$id = luniqid; #generates a long id valid everywhere and ever

1

我也很喜欢在这个答案中使用Linux操作系统工具uuidgen的想法: Perl中的5版本UUID

在我的Debian Linux系统上,它位于/usr/bin/uuidgen


0

将你想要出现在你的UUID中的字符混合到set数组中

use warnings;
use feature 'say';

say "Generate passwords\n";
say genPass(16) for (0..10);
say '';
say "Generate UUIDs\n";
say genUUID() for (0..10);

sub genPass {
    my $len = shift;
    my @set = ('A'..'Z','a'..'z',0..9,split('','~!@#$%^&*()_+{}[]-=;:<>?"\''));
    my $num = $#set;
    my $uuid;

    $uuid .= $set[rand($num)] while $len--;

    return $uuid;
}

sub genUUID {
    my $uuid;
    my @set = ('a'..'z',0..9);
    my $num = $#set;

    $uuid .= $set[rand($num)] for 1..8;
    $uuid .= '-';
    for (1..3) {
        $uuid .= $set[rand($num)] for 1..4;
        $uuid .= '-';
    }

    $uuid .= $set[rand($num)] for 1..12;

    return $uuid;
}

输出示例

Generate passwords

yWXjV{{z0=6T-NVt
<ETH0(9IETcb[c!=
]cONV~*6PoTp1L~<
F8Ve>^u<Hymq]ZFd
<fdV(Z[~EUE?_Ufe
9A9y*iJ3Wta:jg*Y
7r2pP<1voI@x=cFe
Z7bZdha+U;:7aAeT
c2?a7S"mEpt%q43V
uC^q5]iPg~8E4CwJ
gwK+CBM?bnvgS@hg

Generate UUIDs

arrle2tc-x414-o8qi-i82f-obmwrbumlows
xmeg8ekk-ka2m-k4vo-l6xn-lor2s3z1lgn4
35d36bfr-jngc-6qiv-ubq8-nlysa2oaja12
m6yi4joo-1lpv-8obg-zjed-yesyqnq6rjxh
d3edwfbf-znwo-8s2o-4ld3-vntd20ps1fe5
twim8wr7-z0jj-0a20-uypt-sk80yubnaj8h
b4fkoodo-sp16-sa0h-2nlm-kicej06wlwn6
1r1rjy50-2wjo-620t-5ffn-5quw5qjztdfo
tr005kl0-k6yt-syz2-nrhq-k83ghybxjzm1
opxm1mjz-mvu8-feyf-if5o-411zayail60w
380v388j-acct-3zap-0nty-688b04eozrkx

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接