perlのhash randomizationに対する勘違いをしていた
perlの5.18からhash randomizationが導入されるとのことで、同一hashに対しても毎回keys,values,eachをやるたびに結果が変わるんだろと思ってたんですが、hash sliseを行った場合なんかやってもちゃんと動作します。
use strict; use warnings; use Data::Dumper; my $hash_seme = { 1 => 1, 2 => 2, 3 => 3, 4 => 4 }; my $hash_uke = { 1 => 1, 2 => 2, 3 => 3 }; @{$hash_uke}{keys %$hash_seme} = values %$hash_seme; print Dumper $hash_uke;
$VAR1 = { '3' => 3, '4' => 4, '2' => 2, '1' => 1 };
なんでだろうなぁと思っていたら、ある方にこちら教えてもらいまして
Further, every hash has its own iteration order, which should make it much more difficult to determine what the current hash seed is.
http://search.cpan.org/~rjbs/perl-5.18.1/pod/perl5180delta.pod#Hash_randomization
同一ハッシュから取れるorderは同一であるようです。
hash randomizationと聞くとアクセスするたびに違うorderになるものかと思っていたのですがどうやら思い込みだったようです。おそらく気をつけるべきケースは、DBやYAMLなどから読み込んだ場合にそこの順序が想定されたものではないというもののようです。