Khi tôi sử dụng std.algorithm.copy
trên đối tượng std.digest
, tôi nhận được kết quả khác so với khi tôi đang sử dụng put
byte theo byte. Tại sao?std.algorithm.copy và 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);
}
Output:
E134CED312B3511D88943D57CCD70C83
E134CED312B3511D88943D57CCD70C83
D41D8CD98F00B204E9800998ECF8427E
Đây là báo cáo lỗi: https://issues.dlang.org/show_bug.cgi?id=9102 Tôi không nhớ nếu có lý do nào được đưa ra vì sao bản sao không vượt qua phạm vi bằng cách ref. Chúng tôi chưa bao giờ xác định liệu phạm vi đầu ra kiểu giá trị có hợp pháp không (và nó cũng không được định nghĩa rõ ràng cho InputRanges). Một cái gì đó cần phải được thực hiện cho tiêu hóa là một vô hiệu hóa này (điều này) để tránh sao chép im lặng. Nhưng tôi đoán nó đến muộn vì điều này sẽ phá vỡ mã hợp lệ là tốt. – jpf
Như một cách giải quyết, bạn có thể sử dụng MD5Digest (là một lớp) thay vì MD5 (đó là một cấu trúc). – Thayne