2015-04-15 49 views
3

爲Python的hash功能的摘要文檔讀取:Perl的Python等價於哈希(或Java的hashCode)函數?

Type:  builtin_function_or_method 
String form: <built-in function hash> 
Namespace: Python builtin 
Docstring: 
hash(object) -> integer 

Return a hash value for the object. Two objects with the same value have 
the same hash value. The reverse is not necessarily true, but likely. 

(例如,當施加到文檔字符串的hash函數上述返回整數3071661466461282235.)

有Perl等同功能?

編輯:我正在尋找不需要返回任何參數Python的hash函數相同的值。

+2

您是否在尋找* any * hashing函數或者專門給出與Python相同的結果(至少對於原始值) – Quentin

+0

@Quentin:謝謝您的提問;我在帖子中添加了一個說明。簡而言之,與Python的'hash'協議是沒有必要的(儘管,現在你提到它,它會很好,但只是作爲一個令人愉快的獎金,根本不需要)。 – kjo

+0

'sub hash {return unpack(「%32W *」,「@_」)}'因爲python函數只對字符串有意義嗎? http://stackoverflow.com/a/793835/223226 –

回答

1

散列對象有多種方式。用Perl來做這件事的最好方法是通過一個模塊。

E.g. Digest::SHA

這將這樣的工作:

use Digest::SHA qw(sha1 sha1_hex sha1_base64 ...); 

$digest = sha1($data); 
$digest = sha1_hex($data); 
$digest = sha1_base64($data); 

$digest = sha256($data); 
$digest = sha384_hex($data); 
$digest = sha512_base64($data); 

您可以通過在CPAN運行i /Digest/perl -MCPAN -e shell看到各種選項的列表。 Digest::MD5是另一個常見的選擇。

我會建議用於微不足道的實現,它實際上並沒有太大的差別,你使用。如果它不重要,那麼存在與散列衝突相關的安全問題。

+1

這將散列一串字節。這可能或可能不是需要的。 – ikegami

1

首先,你應該重載你的對象的「to-string」方法。如果你只想在散列中使用對象作爲鍵,這可能就足夠了。 Perl使用一些內部的散列機制來快速獲取鍵值。其次,你可以對結果字符串應用任何散列機制,例如,或者,如果你不需要強大的安全要求,那麼你可以使用Digest::MurmurHash(公佈的MurmurHash速度爲5Gb/s!)。