2016-03-14 5 views
5

Wenn ich std.algorithm.copy auf std.digest Objekte verwende, bekomme ich andere Ergebnisse verglichen, wenn ich put byteweise verwende. Warum?std.algorithm.copy und Std.digest

import std.stdio; 
import std.digest.digest; 
import std.digest.md; 
import std.algorithm; 

void main() { 
    string s = "Hello!\n"; 
    auto d1 = makeDigest!MD5; 
    auto d2 = makeDigest!MD5; 
    foreach (ubyte b; s) { 
     d1.put(b); 
    } 
    s.copy(d2); 
    writeln(digest!MD5(s).toHexString); 
    writeln(d1.finish().toHexString); 
    writeln(d2.finish().toHexString); 
} 

Ausgang:

E134CED312B3511D88943D57CCD70C83 
E134CED312B3511D88943D57CCD70C83 
D41D8CD98F00B204E9800998ECF8427E 

Antwort

4

d2 wird durch Wert übergeben zu kopieren. Die Daten werden innerhalb der Funktion kopiert, aber wenn sie zurückkommt, ist die d2 Variable auf der außerhalb unverändert!

Ich denke irgendwie, dass dies ein Fehler sein könnte: das aktuelle Verhalten ist für mich nicht sehr sinnvoll. Wenn Sie es kopieren, ist es sinnvoll, es als Referenz zu verwenden. Die Unit testet nur Test-Arrays, die eine halbe Referenz (sie sind Zeiger) und es funktioniert für sie.

+1

Hier ist der Fehlerbericht: https://issues.dlang.org/show_bug.cgi?id=9102 Ich erinnere mich nicht, wenn es einen Grund gegeben wurde, warum Kopie nicht den Bereich durch ref übergibt. Wir haben nie spezifiziert, ob Ausgabebereiche vom Typ value legal sind (und auch nicht explizit für InputRanges definiert). Etwas, das für Digests implementiert werden sollte, ist ein deaktiviertes (dies), um stummes Kopieren zu vermeiden. Aber ich denke, es ist zu spät, da dies auch gültigen Code brechen würde. – jpf

+2

Als Workaround könnten Sie MD5Digest (eine Klasse) anstelle von MD5 (das ist eine Struktur) verwenden. – Thayne