Gibt Perl garantiert konsistent geordnete Hash-Schlüssel zurück?

8

Gegeben etwas wie

%Vor%

Wird Perl garantiert, dass die Schlüssel in einer konsistenten Reihenfolge durchlaufen werden, wenn der Hashwert nicht geändert wird?

    
erjiang 10.08.2009, 18:39
quelle

3 Antworten

26

Ja . Von perldoc -f keys :

  

Die Schlüssel werden scheinbar zufällig zurückgegeben. Die tatsächliche zufällige Reihenfolge kann in zukünftigen Versionen von Perl geändert werden, aber ist garantiert die gleiche Reihenfolge wie die values oder each Funktion erzeugt (vorausgesetzt, dass der Hash nicht modifiziert wurde) . Seit Perl 5.8.1 unterscheidet sich die Reihenfolge selbst zwischen verschiedenen Perl-Ausführungen aus Sicherheitsgründen (siehe "Algorithmische Komplexitätsangriffe" in perldoc perlsec <) / a>).

(Betonung meiner)

    
Adam Batkin 10.08.2009, 18:43
quelle
0

Bearbeiten:

Obwohl ein normaler Hash eine konsistente Reihenfolge hat, im Falle eines gebundenen Hashs die Reihenfolge der Schlüssel ist nicht gut definiert , da es benutzergesteuert ist!

Obwohl sich die Reihenfolge der Hash-Schlüssel nicht ändert, sollten Sie wahrscheinlich überdenken, warum Sie dies tun müssen.

Vielleicht können Sie den Hash in einem Durchgang statt in zwei verarbeiten?

Sie sollten die Hash-Schlüssel in einem Array als defensive Programmierungspraxis speichern, es sei denn, die Größe der Daten ist groß genug, so dass ein Duplizieren es wäre ein Problem. Als Bonus können Sie die Liste sogar leicht sortieren und im Hash in einer genau definierten Reihenfolge verarbeiten. Z. B.

%Vor%

Dies vermeidet Probleme mit der Änderung des Hashs, da sich Ihre Array-Reihenfolge niemals ändern wird, außer Sie möchten es.

Wenn Sie dies nicht tun, müssen Sie sehr vorsichtig sein, nichts zu tun, was den Hash ändert, sonst ändert sich die Reihenfolge der Elemente. Schauen Sie in das Readonly -Modul, um sicherzustellen, dass dieser Hash niemals geändert wird.

    
Kevin Panko 10.08.2009 19:38
quelle
-2

Das ist eine ziemlich heikle Erwartung. Es wird wahrscheinlich, aber warum sich Sorgen machen? Holen Sie Schlüssel im Voraus, speichern Sie das Ergebnis und durchlaufen Sie das gespeicherte Ergebnis. Dann haben Sie garantiert Zugriff auf die Schlüssel in der gleichen Reihenfolge. Es ist gefährlich, an den Rändern unspezifizierter Implementierungsdetails zu arbeiten.

EDIT: Verpasste die "Garantie" im Doc, aber ich denke immer noch, es ist gefährlich zu erwarten, dass sich das niemals ändern wird. Vor allem, wenn es bessere Möglichkeiten gibt, die gleichen Ziele zu erreichen.

    
xcramps 10.08.2009 18:55
quelle

Tags und Links