Perl   发布时间:2022-04-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Perl中的快速字符串校验和函数生成0..2 ^ 32-1范围内的值大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在寻找具有以下属性的Perl字符串校验和函数:

>输入:未定义长度的Unicode字符串($String)
>输出:无符号整数($hash),0 <= $hash <= 2 ^ 32-1成立(0到4294967295,匹配4字节MySQL unsigned int的大小)

代码:

sub checksum {
    my $String = shift;
    my $hash;
    ... checksum logic goes here ...
    die unless ($hash >= 0);
    die unless ($hash <= 4_294_967_295);
    return $hash;
}

理想情况下,校验和函数应该快速运行,并应在目标空间(0 .. 2 ^ 32-1)中均匀地生成值,以避免碰撞.在这个应用程序中,随机碰撞是完全不致命的,但显然我想避免它们在可能的程度上.

虑到这些要求,解决这个问题的最好办法是什么?

解决方法

任何哈希函数都将是足够的 – 简单地将其截断为4字节并转换为一个数字.好的哈希函数有一个随机分布,无论你截断字符串的位置,这个分布将是常数.

我建议Digest::MD5因为它是Perl作为标准配置中最快的哈希实现. String :: CRC,作为Pim提到,也在C中实现,应该更快.

以下是计算哈希值并将其转换为整数的方法:

use Digest::MD5 qw(md5);
my $str = substr( md5("String-to-hash"),4 );
print unpack('L',$str);  # Convert to 4-byte Integer (long)

大佬总结

以上是大佬教程为你收集整理的Perl中的快速字符串校验和函数生成0..2 ^ 32-1范围内的值全部内容,希望文章能够帮你解决Perl中的快速字符串校验和函数生成0..2 ^ 32-1范围内的值所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。