2010-03-18 55 views
4

我正在编写多个客户端和服务器之间的消息传输程序。如何在Perl中使用哈希生成唯一ID?

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

对于消息传输,我使用的散列的数据结构,例如:

{ 
api => POST, 
username => sganesh, 
pass => "pass", 
message => "hai", 
time => "current_time", 
} 

我想用该散列以产生一个唯一的ID。

我尝试了几种方法,MD5和冻结,但这些给不可读的ID。我想要一些有意义或可读的唯一ID。

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

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

任何人都可以帮我解决这个问题吗?

在此先感谢。

+0

“MD5和冻结,但这给不可读的ID”。不可读的id是什么意思? – codaddict

+0

这意味着垃圾字符。 对于例如:如果我的ID是像name_01它可以由任何用户可读。但MD5和冻结返回类似垃圾字符 – sganesh

+0

因此,使用'md5_hex()',它不会返回不可读的字符。 (请参阅Digest :: MD5的文档。) – Ether

回答

7

我怀疑你不想做你在问什么,但你可以做到。

  • 取散列键/值并将它们拼合成一个数组@foo = (%foo)

  • MD5获取ID码的数组 - 使用md5_base64(@foo)如果您希望它是7位(可读的)。

  • 请记住,散列没有排序,所以如果你想要它是可重复的,你需要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(令牌),并把它给客户端返回给你,但是从你的问题来看,我不知道你的动机。

+0

优秀。但是,如果身份证的长度更少,我会很高兴。 有什么办法可以减少它的长度。 – sganesh

+0

这取决于你想要你的'唯一'身份证是'独一无二'。 128位MD5只有约340,282,366,920,938,463,463,374,607,431,768,211,000(2^128)个组合。如果仍然看起来太多,只需使用128个组合(2^7)的ID的第一个字符。或者可能是一些中间地带;-) –

+1

(在一些学者纠正我之前,我知道截断MD5不是一个好主意,因为分布可能不是偶数) –

6

这听起来像是一份Data::UUID的工作。

此外,唯一ID用于计算机。无论如何,你可以抽象出你喜欢的人类。 :)