Es gibt nicht viele Garantien über die Reihenfolge der Hash-Schlüssel in Perl. Gibt es eine Erwähnung in Dokumenten, die ich nicht finden kann, die sagen würde, dass, solange zwei Hashes genau dieselben Schlüssel verwenden, sie in genau derselben Reihenfolge gehen werden?
Kurzer Test scheint das zu bestätigen. Selbst wenn ich einige zusätzliche Schlüssel für die interne Schlüsseltabelle zwischen zwei verschiedenen Hashes erzeuge, werden ihre Schlüssel in der gleichen Reihenfolge zurückgegeben:
%Vor% Ich würde mich jedoch nicht auf udokumentiertes Verhalten verlassen, und Tatsache, die einfach in Dokumenten gefunden werden kann, ist, dass keys
, values
und each
alle dieselbe Reihenfolge verwenden, solange Hash nicht geändert wird.
Seit mindestens 5.18 wird das folgende explizit in perldoc perlsec erwähnt:
keys
,values
undeach
geben Elemente in einer per Hash-Zufallsreihenfolge zurück. Durch das Ändern eines Hashs durch Einfügen wird die Iterationsreihenfolge geändert Hash.
Perl hat niemals eine Reihenfolge der Hash-Schlüssel garantiert, und der Die Bestellung hat sich während der Laufzeit von Perl bereits mehrfach geändert 5. Die Reihenfolge der Hash-Schlüssel war und ist auch immer von der Reihenfolge der Anzeigen und der Historie der vorgenommenen Änderungen abhängig der Hash während seiner Lebensdauer.
Daher ist es NICHT garantiert, dass zwei Hashes mit demselben Schlüsselsatz in der gleichen Reihenfolge iteriert werden.
Von Perlsec:
Perl hat niemals die Reihenfolge der Hash-Schlüssel garantiert und der Die Bestellung hat sich während der Laufzeit von Perl bereits mehrfach geändert 5. Auch die Reihenfolge der Hash-Schlüssel war und ist immer von der Reihenfolge der Anzeigen betroffen.
Es wird ausdrücklich garantiert, dass dies unzuverlässig ist.
Weitere Informationen finden Sie im Abschnitt Algorithmic Complexity Attacks von qw(a b c d e f)
. Trotz seiner bedauerlichen Inkohärenz heißt es:
Die Dokumentation garantiert nicht , dass die Reihenfolge immer gleich ist; In der Tat heißt es ausdrücklich, dass es in einem pathologischen Fall nicht vorhersagbar sein wird. Sollte die Hashing-Funktion in einer zukünftigen Version geändert werden, ist es möglich, dass Daten, die bisher kein degeneriertes Hashing erzeugt haben, dies nun tun würden und dann der zufälligen Störung unterliegen würden.
Wenn Sie also nicht 5.8.1, vielleicht verwenden, erhalten Sie die gleiche Reihenfolge, und vielleicht ändert sich das bei Ihnen nicht Aktualisieren Sie Ihre Perl, aber es könnte. Wenn Sie 5.8.1 verwenden, ist eine zufällige Reihenfolge garantiert .
Wenn Sie eine zuverlässige Reihenfolge wünschen, verwenden Sie eine der CPAN-Klassen, die einen Hash mit einer garantierten Schlüsselreihenfolge bereitstellen - Tie :: Hash :: Indiziert , Tie :: IxHash - oder sortiere einfach deine Schlüssel. Wenn Sie einen Hashwert mit weniger als ein paar tausend Schlüsseln haben, werden Sie wahrscheinlich keinen nennenswerten Unterschied bemerken. Wenn es mehr als das hat, sollten Sie vielleicht eine schwerere Lösung wie eine Datenbank in Erwägung ziehen.
Edit: und nur um es interessanter zu machen, werden Schlüssel zufällig nach 5.18 geordnet .
Hier ist ein Gegenbeispiel, das kürzer ist als diese Frage): Ausgabe:
perldoc -f-Schlüssel enthält einige Informationen zur Bestellung:
Die Schlüssel eines Hash werden in einer scheinbar zufälligen Reihenfolge zurückgegeben. Die tatsächliche zufällige Reihenfolge kann in zukünftigen Versionen von Perl geändert werden, aber es ist garantiert, dass sie der Reihenfolge entspricht, in der die Werte oder jede Funktion erzeugt wird (vorausgesetzt, der Hash wurde nicht geändert). Seit Perl 5.8.1 kann die Reihenfolge selbst zwischen verschiedenen Perl-Ausführungen aus Sicherheitsgründen anders sein (siehe Algorithmische Komplexitätsangriffe in Perlsec).
Die einzige Garantie ist, dass keine Bestellung garantiert ist.
Seit mindestens 5.18 wird das folgende explizit in perldoc perlsec erwähnt:
%code% , %code% und %code% geben Elemente in einer per Hash-Zufallsreihenfolge zurück. Durch das Ändern eines Hashs durch Einfügen wird die Iterationsreihenfolge geändert Hash.
Perl hat niemals eine Reihenfolge der Hash-Schlüssel garantiert, und der Die Bestellung hat sich während der Laufzeit von Perl bereits mehrfach geändert 5. Die Reihenfolge der Hash-Schlüssel war und ist auch immer von der Reihenfolge der Anzeigen und der Historie der vorgenommenen Änderungen abhängig der Hash während seiner Lebensdauer.
Daher ist es NICHT garantiert, dass zwei Hashes mit demselben Schlüsselsatz in der gleichen Reihenfolge iteriert werden.
Es gibt nicht viele Garantien über die Reihenfolge der Hash-Schlüssel in Perl. Gibt es eine Erwähnung in Dokumenten, die ich nicht finden kann, die sagen würde, dass, solange zwei Hashes genau dieselben Schlüssel verwenden, sie in genau derselben Reihenfolge gehen werden?
Kurzer Test scheint das zu bestätigen. Selbst wenn ich einige zusätzliche Schlüssel für die interne Schlüsseltabelle zwischen zwei verschiedenen Hashes erzeuge, werden ihre Schlüssel in der gleichen Reihenfolge zurückgegeben:
%Vor%Ich würde mich jedoch nicht auf udokumentiertes Verhalten verlassen, und Tatsache, die einfach in Dokumenten gefunden werden kann, ist, dass %code% , %code% und %code% alle dieselbe Reihenfolge verwenden, solange Hash nicht geändert wird.
Von Perlsec:
Perl hat niemals die Reihenfolge der Hash-Schlüssel garantiert und der Die Bestellung hat sich während der Laufzeit von Perl bereits mehrfach geändert 5. Auch die Reihenfolge der Hash-Schlüssel war und ist immer von der Reihenfolge der Anzeigen betroffen.
Es wird ausdrücklich garantiert, dass dies unzuverlässig ist.
Weitere Informationen finden Sie im Abschnitt Algorithmic Complexity Attacks von perlsec
. Trotz seiner bedauerlichen Inkohärenz heißt es:
Die Dokumentation garantiert nicht , dass die Reihenfolge immer gleich ist; In der Tat heißt es ausdrücklich, dass es in einem pathologischen Fall nicht vorhersagbar sein wird. Sollte die Hashing-Funktion in einer zukünftigen Version geändert werden, ist es möglich, dass Daten, die bisher kein degeneriertes Hashing erzeugt haben, dies nun tun würden und dann der zufälligen Störung unterliegen würden.
Wenn Sie also nicht 5.8.1, vielleicht verwenden, erhalten Sie die gleiche Reihenfolge, und vielleicht ändert sich das bei Ihnen nicht Aktualisieren Sie Ihre Perl, aber es könnte. Wenn Sie 5.8.1 verwenden, ist eine zufällige Reihenfolge garantiert .
Wenn Sie eine zuverlässige Reihenfolge wünschen, verwenden Sie eine der CPAN-Klassen, die einen Hash mit einer garantierten Schlüsselreihenfolge bereitstellen - Tie :: Hash :: Indiziert , Tie :: IxHash - oder sortiere einfach deine Schlüssel. Wenn Sie einen Hashwert mit weniger als ein paar tausend Schlüsseln haben, werden Sie wahrscheinlich keinen nennenswerten Unterschied bemerken. Wenn es mehr als das hat, sollten Sie vielleicht eine schwerere Lösung wie eine Datenbank in Erwägung ziehen.
Edit: und nur um es interessanter zu machen, werden Schlüssel zufällig nach 5.18 geordnet .
Hier ist ein Gegenbeispiel, das kürzer ist als diese Frage): Ausgabe:
perldoc -f-Schlüssel enthält einige Informationen zur Bestellung:
Die Schlüssel eines Hash werden in einer scheinbar zufälligen Reihenfolge zurückgegeben. Die tatsächliche zufällige Reihenfolge kann in zukünftigen Versionen von Perl geändert werden, aber es ist garantiert, dass sie der Reihenfolge entspricht, in der die Werte oder jede Funktion erzeugt wird (vorausgesetzt, der Hash wurde nicht geändert). Seit Perl 5.8.1 kann die Reihenfolge selbst zwischen verschiedenen Perl-Ausführungen aus Sicherheitsgründen anders sein (siehe Algorithmische Komplexitätsangriffe in Perlsec).
Die einzige Garantie ist, dass keine Bestellung garantiert ist.