require Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(lock_keys unlock_keys lock_value unlock_value
- lock_hash unlock_hash hashes_random
+ lock_hash unlock_hash hash_seed
);
our $VERSION = 0.05;
use Hash::Util qw(lock_keys unlock_keys
lock_value unlock_value
lock_hash unlock_hash
- hashes_random);
+ hash_seed);
%hash = (foo => 42, bar => 23);
lock_keys(%hash);
lock_hash (%hash);
unlock_hash(%hash);
- my $hashes_random = hashes_random();
+ my $hashes_are_randomised = hash_seed() != 0;
=head1 DESCRIPTION
}
-=item B<hashes_random>
+=item B<hash_seed>
- my $hashes_random = hashes_random();
+ my $hash_seed = hash_seed();
-hashes_random() returns true if Perl hashes are randomised as in Perl
-5.8.1 and later, false if Perl hashes have a predictable order as in
-Perl 5.8.0 and earlier.
+hash_seed() returns the seed number used to randomise hash ordering.
+Zero means the "traditional" random hash ordering, non-zero means the
+new even more random hash ordering introduced in Perl 5.8.1.
=cut
-sub hashes_random () {
- Internals::hashes_random();
+sub hash_seed () {
+ Internals::hash_seed();
}
=back
chdir 't';
}
}
-use Test::More tests => 155;
+use Test::More tests => 157;
use strict;
my @Exported_Funcs;
@Exported_Funcs = qw(lock_keys unlock_keys
lock_value unlock_value
lock_hash unlock_hash
+ hash_seed
);
use_ok 'Hash::Util', @Exported_Funcs;
}
}
}
+my $hash_seed = hash_seed();
+ok($hash_seed >= 0, "hash_seed $hash_seed");
denial-of-service attack against Perl code, even remotely, see
L<perlsec/"Algorithmic Complexity Attacks"> for more information.
B<Do not disclose the hash seed> to people who don't need to know it.
-See also hashes_random() of L<Hash::Util>.
+See also hash_seed() of L<Hash::Util>.
=item PERL_ROOT (specific to the VMS port)
XS(XS_Internals_hv_clear_placehold);
XS(XS_PerlIO_get_layers);
XS(XS_Regexp_DESTROY);
-XS(XS_Internals_hashes_random);
+XS(XS_Internals_hash_seed);
void
Perl_boot_core_UNIVERSAL(pTHX)
newXSproto("PerlIO::get_layers",
XS_PerlIO_get_layers, file, "*;@");
newXS("Regexp::DESTROY", XS_Regexp_DESTROY, file);
- newXSproto("Internals::hashes_random",XS_Internals_hashes_random, file, "");
+ newXSproto("Internals::hash_seed",XS_Internals_hash_seed, file, "");
}
XSRETURN(0);
}
-XS(XS_Internals_hashes_random)
+XS(XS_Internals_hash_seed)
{
dXSARGS;
- XSRETURN_IV(PL_hash_seed ? 1 : 0);
+ XSRETURN_UV(PL_hash_seed);
}