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
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
Als Workaround könnten Sie MD5Digest (eine Klasse) anstelle von MD5 (das ist eine Struktur) verwenden. – Thayne