2010-03-18 59 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用於計算機。無論如何,你可以抽象出你喜歡的人類。 :)