如何在Perl中使用哈希生成唯一ID?

3
我正在编写一个多客户端和服务器之间的消息传输程序。
我想为每个消息生成一个唯一的消息ID。它应该由服务器生成并返回给客户端。
对于消息传输,我正在使用哈希数据结构,例如:
{
api => POST,
username => sganesh,
pass => "pass",
message => "hai",
time => "current_time",
}

我想使用这个哈希算法生成一个唯一的ID。
我尝试了几种方法,如MD5和freeze,但这些方法生成的ID不可读。我希望能够生成有意义或可读性强的唯一ID。
我想到可以使用微秒来区分ID,但是问题在于多个客户端会产生冲突。
无论何时,这些ID都应该是唯一的。
有人能帮我解决这个问题吗?
提前感谢。

"MD5和冻结,但这会生成不可读的ID。" 不可读的ID是什么意思? - codaddict
它意味着垃圾字符。 例如:如果我的ID类似于name_01,那么任何用户都可以读取它。但是MD5和冻结返回的是一些垃圾字符。 - sganesh
因此,请使用md5_hex(),它不会返回不可读的字符。(请参阅Digest::MD5的文档。) - Ether
2个回答

9
我猜你不想做你所要求的事情,但你是可以做到的。
- 取哈希键/值并将它们扁平化为一个数组@foo = (%foo)。 - 对数组进行MD5处理以获取ID代码 - 如果您希望其为7位(人类可读),请使用md5_base64(@foo)。 - 请记住,哈希不是有序的,因此如果您希望它可重复,请对数组进行排序sort @foo
在代码中,类似于这样:
use Digest::MD5 qw(md5_base64);

my $foo = {
    api => POST,
    username => sganesh,
    pass => "pass",
    message => "hai",
    time => "current_time",
};

my $id = md5_base64(sort %$foo); # in my case eRR9QzGN1n+nIl1TDmclEA

说实话,我认为最好生成一个唯一的随机ID(令牌)并将其提供给客户端返回给您,但是从您的问题中,我不知道您的动机。

很好。但如果ID的长度更短,我会非常高兴。 有没有办法缩短它的长度? - sganesh
这取决于您想要多“独特”的ID。128位MD5仅有约340,282,366,920,938,463,463,374,607,431,768,211,000(2^128)种组合。如果这仍然太多,只需使用具有128种组合(2^7)的ID的第一个字符。或者也可以采用一些折中方案;-) - Gavin Brock
1
(在某些人纠正我之前,我知道截断MD5不是一个好主意,因为分布可能不均匀) - Gavin Brock
2
这里存在一个问题,尽管对于应用程序来说可能并不重要。另一个哈希值恰好具有相同的数据,即使它本应是完全独立的记录,也会给你提供相同的MD5。 - brian d foy
是的,我知道我们有时可以从MD5返回的ID中获取一部分,但这可能不是唯一的。这就是为什么我问是否有其他方法来缩短长度。但无论如何,感谢Gavin Brock。我对你的回答非常满意。 - sganesh

6
这似乎是一个需要使用Data::UUID的任务。
此外,这个唯一的ID是为计算机而设计的。你可以以任何你喜欢的方式将其抽象化为人类可读的形式。 :)

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