0

无关:

我是堆栈溢出的新手,我想打个招呼!

论题:

我正在为需要通过时间戳创建和删除随机文件夹的应用程序生成版本 5 time()UUID

my $md5_UUID  = create_uuid_as_string(UUID_MD5, time."$job");

这些文件夹在每个作业的每次运行中生成,并在运行后被删除。如果以某种方式生成相同的 UUID,正在运行的 +-1000 个作业可能会停止。

有没有我可以从中提取的信息或任何冲突的可能性(不同的数据生成相同的 UUID)?它们真的是独一无二的吗?另外,我应该在 SHA1 和 MD5 之间使用哪个版本的 UUID?

4

3 回答 3

4

使用操作系统工具

可能有一个纯粹的 Perl 解决方案,但它可能是矫枉过正。如果您在 Linux 系统上,您可以捕获mktempuuidgen的结果并在您的 Perl 脚本中使用它们。例如:

$ perl -e 'print `mktemp --directory`'
/tmp/tmp.vx4Fo1Ifh0

$ perl -e '$folder = `uuidgen`; print $folder'
113754e1-fae4-4685-851d-fb346365c9f0

mktemp实用程序很好,因为除了返回目录名称之外,它还会自动为您创建目录。您还可以通过修改模板为目录赋予更有意义的名称(请参阅 参考资料man 1 mktemp);相比之下,UUID 并不擅长传达有用的语义。

于 2013-06-20T23:20:10.247 回答
0

如果文件夹仅持续一个作业的长度,并且所有作业都在同一台机器上运行,则可以使用 pid 作为文件夹名称。根本不需要 uuid。

于 2013-06-20T22:07:14.193 回答
0

使用 v1 UUID

Perl 的time()函数精确到秒。因此,如果您每秒多次启动工作,或者同时在不同的主机上启动工作,则很容易发生冲突。

相比之下,v1 UUID 的时间字段以纳秒为粒度,它包括生成主机的 MAC 地址。有关详细信息,请参阅RFC 4122 。我可以想象一个不能保证唯一性的情况(客户端机器是单独的第 3 层虚拟网络上的虚拟机,都具有相同的虚拟 MAC 地址),但这似乎是病态的人为。

于 2017-03-14T16:15:11.840 回答