如何在Perl 5.18中更改默认的一次一个硬哈希函数?

如何在Perl 5.18中更改默认的一次一个硬哈希函数?,perl,hash,perl5.18,Perl,Hash,Perl5.18,我对Perl不是很熟悉,但在过去的两天里,我一直在文档和其他来源中搜索,但都没有成功。文件中写道: Perl v5.18包括对多个哈希函数的支持,并更改了默认值(将一次一个\u硬),您可以通过在编译时定义符号来选择不同的算法。有关当前列表,请参阅安装文档。注意,从PerlV5.18开始,我们只能建议使用默认值或SIPHASH。所有其他人都有安全问题,仅用于研究目的 问题是,无论是在安装文档中,还是在其他源/站点中,我都无法找到如何定义此符号 我想做的是将默认的ONE\u AT\u TIME\u

我对Perl不是很熟悉,但在过去的两天里,我一直在文档和其他来源中搜索,但都没有成功。文件中写道:

Perl v5.18包括对多个哈希函数的支持,并更改了默认值(将
一次一个\u硬
),您可以通过在编译时定义符号来选择不同的算法。有关当前列表,请参阅安装文档。注意,从PerlV5.18开始,我们只能建议使用默认值或SIPHASH。所有其他人都有安全问题,仅用于研究目的

问题是,无论是在安装文档中,还是在其他源/站点中,我都无法找到如何定义此符号


我想做的是将默认的
ONE\u AT\u TIME\u HARD
hash函数更改为
ONE\u AT\u TIME\u OLD
,这样我就可以模拟旧的Perl 5.16行为。

这听起来像是一个XY问题。通过强制将perl中的哈希算法降级为已知问题的哈希算法,您试图实现什么

从评论中:


我需要运行许多用Perl5.16编写的测试用例,这些用例的功能依赖于旧的哈希实现,而且由于有数百个用例,所以很难更改代码

哇,这是个坏消息。找到那些开发人员,用一份副本击中他们的头部:

散列是由标量值的关联字符串键索引的无序集合

具体来说,如果这对您来说是一个问题,那么这意味着您的代码库将按顺序处理哈希,而哈希不是,也从来不是。(只是他们在5.18之前相当一致,在5.18之后更随机)

发件人:

当遇到这些更改时,清除这些更改的关键是接受散列是无序集合,并采取相应的行动

见:

回答您的问题-如果您确实必须:

但这是一个非常糟糕的主意,因为正如perl源代码包中的
安装
文件所指出的:

注意,从Perl5.18开始,我们只能建议使用default或SIPHASH。所有其他人都有安全问题,仅用于研究目的

通过以这种方式构建
perl
,您为使用它的每个
perl
程序引入了一个已知的安全漏洞


注意-
ONE\u AT\u A\u TIME\u HARD
是新的默认值,因此这不会改变Perl5.18的工作方式。您可能是指
PERL\u HASH\u FUNC\u ONE\u A\u TIME\u OLD

这听起来像个XY问题。通过强制将perl中的哈希算法降级为已知问题的哈希算法,您试图实现什么

从评论中:


我需要运行许多用Perl5.16编写的测试用例,这些用例的功能依赖于旧的哈希实现,而且由于有数百个用例,所以很难更改代码

哇,这是个坏消息。找到那些开发人员,用一份副本击中他们的头部:

散列是由标量值的关联字符串键索引的无序集合

具体来说,如果这对您来说是一个问题,那么这意味着您的代码库将按顺序处理哈希,而哈希不是,也从来不是。(只是他们在5.18之前相当一致,在5.18之后更随机)

发件人:

当遇到这些更改时,清除这些更改的关键是接受散列是无序集合,并采取相应的行动

见:

回答您的问题-如果您确实必须:

但这是一个非常糟糕的主意,因为正如perl源代码包中的
安装
文件所指出的:

注意,从Perl5.18开始,我们只能建议使用default或SIPHASH。所有其他人都有安全问题,仅用于研究目的

通过以这种方式构建
perl
,您为使用它的每个
perl
程序引入了一个已知的安全漏洞


注意-
ONE\u AT\u A\u TIME\u HARD
是新的默认值,因此这不会改变Perl5.18的工作方式。您可能是指
PERL\u HASH\u FUNC\u一次一个\u OLD

为什么要这样做?这不是个好主意。这听起来像是一个XY问题。我需要运行许多用perl 5.16编写的测试用例,它们的功能依赖于旧的哈希实现,而且很难更改代码,因为这些用例有数百个。您的代码依赖于显式未排序的数据类型的排序?问题是它不是我的代码。我刚刚被分配了一项任务,以找到一种方法来模拟旧的5.16行为,而我收到的代码实际上是巨大而混乱的。因此,与其对数千个哈希进行排序,我更喜欢检查是否可以通过更改为旧算法来获得相同的行为。在这种情况下,安全性不是问题。你知道我怎么做吗?事实上,如果你需要维护需要-5.16的代码,那么你可能只想使用perl-5.16。如果您的测试无法使用新版本(即开箱即用),那么代码需要重写。您为什么要这样做?这不是个好主意。这听起来像是一个XY问题。我需要运行许多用perl 5.16编写的测试用例,它们的功能依赖于旧的哈希实现,而且很难更改代码,因为这些用例有数百个。您的代码依赖于显式未排序的数据类型的排序?问题是它不是我的代码。我刚刚被分配了一项任务,以找到一种方法来模拟旧的5.16行为,而我收到的代码实际上是巨大而混乱的。因此,与其对数千个哈希进行排序,我更喜欢检查是否可以通过更改为旧算法来获得相同的行为。在这种情况下,安全性不是问题。你知道我怎么做吗?事实上,如果你需要维护需要-5.16的代码,那么你可能只想使用perl-5.16。如果您的测试无法使用新版本(开箱即用),那么代码
./Configure -DPERL_HASH_FUNC_ONE_AT_A_TIME_OLD -des && make && make test