2016-03-14 13 views
5

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 

Trả lời

4

d2 được truyền theo giá trị để sao chép. Dữ liệu được sao chép bên trong hàm, nhưng sau đó khi nó trả về, biến số d2 trên bên ngoài chưa được sửa đổi!

Tôi nghĩ đây có thể là lỗi: hành vi hiện tại không có ý nghĩa gì đối với tôi. Khi bạn đang sao chép nó, nó làm cho tinh thần để làm điều đó bằng cách tham khảo. Các unittests chỉ kiểm tra các mảng là một nửa tham chiếu (chúng là con trỏ) và nó hoạt động cho chúng.

+1

Đâ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

+2

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

Các vấn đề liên quan