Thread overview
Dilim dilimi ile getDigestString()
Oct 08, 2012
Salih Dinçer
Oct 08, 2012
Salih Dinçer
October 08, 2012

Merhaba,

"Derleme zamanı dizi oluşturma", "Dizilerin farklı tanımlamalar arasındaki farklar" vb. başlıklar vermek istesem de konuyu tam olarak tanımlayamadım! İsterseniz tartışmanın seyrine göre isim verelim...

Şöyle bir dizgimiz olsun:
Alıntı:

>
>     string st = "nanecisi";    //doremifa";
> ```

>
Sonra bu sözcüğün içerdiği sözcükleri şu şekilde hecelediğimizi düşünün:
Alıntı:
>
>
>
auto test = new char[st.length];
     test = cast(char[])st;
char[][] hecele;

for(int i; i<test.length; i+=2) {
  hecele ~= test[i..i+2];
  hecele.getDigestString.writeln(": ", hecele);
}
>

Çıktısı aşağıdaki şekilde ve beklendiği gibi her seferinde aynı olacak şekilde çıkar:
'
A117FBA641B346A9E9816EA83410C839: ["na"]
6A3518A7A2FBD36648B6BC5806C60914: ["na", "ne"]
4A639AB0788B0937E9E23BD46E7684A4: ["na", "ne", "ci"]
2F3066B613FA75A48E1E2E4BCCF289BD: ["na", "ne", "ci", "si"]
'
Ancak dikkat!

Burada MD5'i alınan dizi, aslında bir dilim. Yani KOD: [...] şeklinde çıktı aldığımız karakterlerin MD5'ni almıyoruz. Dilim veya nesne(undefined object<--- elbette değil ama şimdilik bilmiyorum!) olduğunu zannediyorum. Kanıtı çok basit çünkü siz kendi bilgisayarınızda yukarıdaki kodu derlediğinizde farklı bir MD5 kodu aldığınızı göreceksiniz...

Şimdi biraz olayı değiştirelim ve diziyi "global variable" yapalım! Belki de yukarıda yanılıyorumdur ki biliyorsunuz, her zaman yanılma payı mevcuttur. Bir de aşağıdaki kodu derlediğinizi düşünün:

import std.stdio, std.md5;

char[8] test = cast(char[])"nanecisi";//doremifa";

void main() {
   char[][] hecele;

   for(int i; i<test.length; i+=2) {
     hecele ~= test[i..i+2];
     hecele.getDigestString.writeln(": ", hecele);
   }
}

Bu sefer çıktıyı vermiyorum ama bana güvenebilirsiniz; her çalıştırdığınızda farklı bir MD5 kodu alacaksınız. Şimdi daha fazla uzatmadan sormak istiyorum...:)

Neden?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 08, 2012

Başlık ve sadeleştirilmiş kod için teşekkürler. Ben de dizinin tanımladığı yer veya tanımlanma yöntemi ile alakalı bir şey zannediyordum...:)

   string a = "test";
   char[] b = a.dup;
   getDigestString(a).writeln(" == ", getDigestString(b));
   getDigestString([a]).writeln(" != ", getDigestString([b]));

Çıktısı:
'098F6BCD4621D373CADE4E832627B4F6 == 098F6BCD4621D373CADE4E832627B4F6
2A5709927ADD77997A560ED34EA2E3EB != C57DC824A33986FCEEB695EB1FE10D5A
'
Belki de ilginç bir şey yoktur! Sonuçta yazılım her çalıştığında farklı bir bellek bölgesine yerleştiriliyor. Hatta bu işlev dizgilerin MD5'ni aldığına göre, dilimlerin gösterdiğine ulaşamaması veya bellekteki adresini işlemesi normal olabilir...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 08, 2012

Garip. Anladığım kadarıyla yalnızca tek düzey aşağı iniyorlar. Dilim dizisi olduğu zaman içteki dilimleri galiba size_t uzunluk üyelerinin ve ptr üyelerinin değerleri ile kullanıyorlar.

Salih gibi ben de şu programda ikinci assert'te != kullanmak zorunda kalıyorum:

import std.md5;

void main() {
   char[] a = "nanecisi".dup;
   string b = "nanecisi";
   assert(getDigestString(a) == getDigestString(b));
   assert(getDigestString([a]) != getDigestString([b]));
}

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]