如何解决Jenkins在Perl中哈希?
我试图在Perl中根据字符串生成Jenkins哈希。
use Digest::JHash qw (jhash);
$digest = jhash ("apa_mp_h_str_avunitm_01");
print "$digest\n";
exit 0;
它返回一个32位整数1303972418。准确地说,它应该成为带符号的整数-1546399138。无论我尝试什么(例如使用Data :: Integer),我都无法终生获得该数字。有人可以给我一些指示吗?
解决方法
如果您希望字符串apa_mp_h_str_avunitm_01
哈希到-1546399138
,则需要String而不是Digest::JHash
才能使用正确的哈希函数(有关Wikipedia的文章, Jenkins的散列函数实际上并未显示Digest::JHash
实现的原始代码;它具有后来在Digest::OAT
中实现的一次性开发的哈希,以及您正在使用的任何代码作为获取该值的参考),您需要将散列值强制为有符号的32位数字(因为它通常至少在64位perls上会返回无符号的数字。不确定32位版本):
# Normal output
$ perl -MDigest::OAT -E 'say Digest::OAT::oat("apa_mp_h_str_avunitm_01")'
2748568158
# Signed 32bit output
$ perl -MDigest::OAT -E 'say unpack("l",pack("l",Digest::OAT::oat("apa_mp_h_str_avunitm_01")))'
-1546399138
,
对于"apa_mp_h_str_avunitm_01"
的输入,-1546399138是this function的输出。 Digest::JHash::jhash implementation实现的功能有所不同,第一个链接中的Wikipedia页面上可能描述了lookup2
或lookup3
函数。一种迹象表明,Perl jhash
工具具有神奇的数字0x9e3779b9
,在简单的函数中没有出现。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。