2016-03-14 6 views
5

std.digest nesnelerinde std.algorithm.copy kullandığımda, put bayt bayt kullandığımda karşılaştırılan farklı sonuçlar elde ediyorum. Niye ya?std.algorithm.copy ve 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); 
} 

Çıktı:

E134CED312B3511D88943D57CCD70C83 
E134CED312B3511D88943D57CCD70C83 
D41D8CD98F00B204E9800998ECF8427E 

cevap

4

d2 kopyalamak için değeri tarafından geçirilir. Veriler fonksiyonun içine kopyalanır, ancak geri döndüğünde, değişkeninin d2 değişkeni değiştirilmez!

Bunun bir hata olabileceğini düşünüyorum: mevcut davranış benim için büyük bir anlam ifade etmiyor. Kopyaladığınızda, referans olarak bunu yapmak mantıklıdır. Unittests sadece yarı referansı olan dizileri (işaretçilerdir) test eder ve onlar için çalışır.

+1

İşte hata raporu: https://issues.dlang.org/show_bug.cgi?id=9102 Herhangi bir neden olup olmadığını hatırlamıyorum kopya neden aralığı ref geçmiyor. Değer tipi çıktı aralıklarının yasal olup olmadığını asla belirtmedik (ve InputRanges için açık bir şekilde tanımlanmamıştır). Sindirimler için uygulanması gereken bir şey bu (bu) sessiz kopyalamayı önlemek için devre dışı bırakılmıştır. Ama sanırım geçerli bir kodu da kırdığı için artık geç olması gerekiyor. – jpf

+2

Bir geçici çözüm olarak, MD5 yerine MD5Digest (bir sınıf) kullanabilirsiniz (bu bir yapıdır). – Thayne