Hash randomizationがやってきた

うわー、だいぶ、間隔が開いちゃった、反省。
という訳で、v5.18から入ったHash randomizationについて。

詳しくは、こちらの「ハッシュのランダム化」をどうぞ。
perl v5.18.0 での変更点perldoc.jp

で、何が変わったかというと、例えば以下のコード。

use strict;
use warnings;
use v5.10;

my %h = ( a => 'foo', b => 'bar', c => 'hoge', d => 'huga' );

use Data::Dumper;
say Dumper( \%h );

my %h1 = %h;
say Dumper( \%h1 );

my %h2 = %h;
say Dumper( \%h2 );

my %h3 = %h;
say Dumper( \%h3 );

これを、Perl v5.16.3で実行してみる。
$ perl aaa.pl
$VAR1 = {
'c' => 'hoge',
'a' => 'foo',
'b' => 'bar',
'd' => 'huga'
};

$VAR1 = {
'c' => 'hoge',
'a' => 'foo',
'b' => 'bar',
'd' => 'huga'
};

$VAR1 = {
'c' => 'hoge',
'a' => 'foo',
'b' => 'bar',
'd' => 'huga'
};

$VAR1 = {
'c' => 'hoge',
'a' => 'foo',
'b' => 'bar',
'd' => 'huga'
};

これは、たぶんご想像通り。

今度は、Perl v5.18.1で実行すると?
$ perl aaa.pl
$VAR1 = {
'd' => 'huga',
'a' => 'foo',
'c' => 'hoge',
'b' => 'bar'
};

$VAR1 = {
'b' => 'bar',
'a' => 'foo',
'c' => 'hoge',
'd' => 'huga'
};

$VAR1 = {
'd' => 'huga',
'c' => 'hoge',
'a' => 'foo',
'b' => 'bar'
};

$VAR1 = {
'a' => 'foo',
'c' => 'hoge',
'b' => 'bar',
'd' => 'huga'
};

代入する度に、順番が変わるよ!

これは、セキュリティ対策で、
ハッシュに使われている値を推測されないための仕組みだそうです。(*1)

続く。

(*1) ハッシュのランダム化 – perl v5.18.0 での変更点 – perldoc.jpより。

Leave a Comment