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

如何在Perl中使用哈希生成唯一ID?,perl,uniqueidentifier,Perl,Uniqueidentifier,我正在编写多个客户端和服务器之间的消息传输程序 我想为每条消息生成一个唯一的消息ID。它应该由服务器生成并返回给客户端 对于消息传输,我使用哈希数据结构,例如: { api => POST, username => sganesh, pass => "pass", message => "hai", time => "current_time", } 我想用这个散列生成一个唯一的ID 我尝试过几种方法,MD5和freeze,但它们给出了无法读取的ID。我想要一些有

我正在编写多个客户端和服务器之间的消息传输程序

我想为每条消息生成一个唯一的消息ID。它应该由服务器生成并返回给客户端

对于消息传输,我使用哈希数据结构,例如:

{
api => POST,
username => sganesh,
pass => "pass",
message => "hai",
time => "current_time",
}
我想用这个散列生成一个唯一的ID

我尝试过几种方法,MD5和freeze,但它们给出了无法读取的ID。我想要一些有意义或可读的唯一ID

我认为我们可以用微秒来区分ID,但这里的问题是多个客户端

在任何情况下,ID都应该是唯一的

有人能帮我解决这个问题吗


提前谢谢。

我想你不想做你要求的事,但你可以做到

  • 获取散列键/值并将它们展平到一个数组
    @foo=(%foo)

  • MD5获取ID代码的数组-如果希望它是7bit(人类可读的),请使用
    MD5_base64(@foo)

  • 请记住,散列不是按顺序排列的,因此如果希望数组可重复,则需要对其进行排序@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用于计算机。你可以为人类抽象出你喜欢的任何东西。:)

“MD5和冻结,但这会给出无法读取的id”。不可读的id意味着什么?它意味着垃圾字符。例如:如果我的id像name_01,任何用户都可以读取。但是MD5和freeze会返回类似垃圾字符的内容,所以使用
MD5\u hex()
,它不会返回不可读的字符。(参见文档摘要::MD5。)太好了。但是如果id的长度变短,我会非常高兴。有没有办法缩短它的长度。这取决于你希望你的“唯一”ID有多“独特”。128位MD5只有大约340282366920938463463374607431768211000(2^128)个组合。如果仍然太多,只需使用ID的第一个字符和128个组合(2^7)。或者是某种中间立场;-)(在一些学究纠正我之前,我知道截断MD5不是一个好主意,因为分布可能不均匀)这有一个问题,尽管它可能对应用程序不重要。另一个恰好具有相同数据的散列可以为您提供相同的MD5,即使它是一个完全独立的记录。是的。我知道,我们可以从MD5返回的id中获取零件,但有时可能不是唯一的。这就是为什么我要用其他方法来缩短长度。但无论如何,谢谢加文·布洛克。我对你的回答非常满意。