【问题标题】:Perl's equivalent of Python's hash (or Java's hashCode) function?Perl 相当于 Python 的 hash(或 Java 的 hashCode)函数?
【发布时间】:2015-06-21 15:59:48
【问题描述】:

Python 的hash 函数的摘要文档如下:

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 函数相同的值。

【问题讨论】:

  • 您是在寻找 任何 散列函数还是专门提供与 Python 相同结果的散列函数(至少对于原始值而言)
  • @Quentin:谢谢你的提问;我在我的帖子中添加了说明。简而言之,与 Python 的 hash 达成一致是没有必要的(不过,既然你提到了它,那会很好,但只是作为一个令人愉快的奖励,根本不需要)。
  • sub hash { return unpack("%32W*", "@_") } 因为python函数只对字符串有意义? stackoverflow.com/a/793835/223226

标签: python perl hash


【解决方案1】:

散列对象的方法有很多种。使用 perl 执行此操作的最佳方法是通过模块。

例如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 shell perl -MCPAN -e shell 中运行 i /Digest/ 来查看各种选项的列表。 Digest::MD5 是另一个常见的选择。

我会建议一些简单的实现,它实际上并没有太大的区别。如果它不是微不足道的,那么就会存在与哈希冲突有关的安全问题。

【讨论】:

  • 这将散列一串字节。这可能是也可能不是需求。
【解决方案2】:

首先,您应该重载对象的“to-string”方法。如果您只想将对象用作散列中的键,这可能就足够了。 Perl 应用了一些内部散列机制来快速key-value 访问。

其次,您可以将任何散列机制应用于生成的字符串,例如Digest::SHA,或者,如果您不需要严格的安全要求,那么您可以使用Digest::MurmurHash(MurmurHash 宣布的速度是 5Gb/s !)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-01
    • 2018-11-16
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 2013-05-11
    相关资源
    最近更新 更多