Bir Şifreyi Rastgele mi Yoksa Sıra İle mi Denemek Daha Hızlıdır?

Selamlar,

Bu makalede aklıma takılan bir soruya daha doğrusu merak ettiğim bir konuya, hep beraber cevap arayacağız :)

Soru : Diyelim ki 6 haneli bir Şifreyi bulmak gereksin. 2 yöntemimiz olsun.

  1. Klasik 1’den 999999’a kadar tüm şifreler, tek tek denenir.
  2. Yol ise çok farklı. Öncelikle 6 haneli olabilecek tüm sayılar bir diziye toplanır. Daha sonra listeden random 1 sayı çekilir. Şifreye ulaşılamaz ise ilgili sayı listeden çıkarılıp, random yeni bir sayı çekilir. Bu işleme, şifre bulunana kadar devam edilir.

Bilin bakalım hangi işlem daha kısa sürer ?

FindByCount(): Bu method, klasik 6 haneli tüm sayıları iç içe 6 döngü ile gezmekte ve şifre bulunduğunda geri dönmektedir. Örneğin 999999 password’ü için, tüm olasılıklar denenmektedir.

FillArray() : 6 haneli tüm sayılar, bir dizi içerisine 6 döngü ile string olarak atılmıştır. Burada amaç, 6 haneli şifre olabilecek tüm sayıların önceden bulunup bir listede tutulmasıdır.

FindByRandom(): Bu methodda amaç, 6 haneli bir şifrenin tüm olasılıklarının bulunduğu bir diziden rastgele bir sayının çekilmesi, ve doğru değil ise ilgili sayının listeden çıkarılıp aynı işlemin şifre bulunana kadar tekrarlanmasıdır.

Aşağıda örnek amaçlı yapılmış 2 deneme görülmektedir. Açık ara fark ile, sıralı sayım yöntemi yani FindByCount() çok daha hızlı sonuca ulaşmaktadır.

Böylece geldik bir makalenin daha sonuna. Bu makalede, rastgele seçim yöntemi mi yoksa sıralı deneme yöntemi mi daha hızlı Myth’ine bir cevap bulmaya çalıştık. Random deneme biraz şansa bir durum gibi gözükse de, sıralı deneme benim gibi sağlamcı developerlar için açık ara en iyi yöntem :)

Yeni bir makalede görüşmek üzere hepinize hoşçakalın.

Tüm Kod:

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

18 Cevaplar

  1. Tagi dedi ki:

    Çok ilginç yazı olmuş. Ellerinize sağlık :)

  2. Ali dedi ki:

    tek bir denemeden bu sonuca nasıl ulaştınız? yüz adet test yapıp mod yada aritmetik ortalamayı paylaşmak daha sağlıklı olacaktır.

    • borsoft dedi ki:

      Selamlar Ali,
      Siz bir selenium ile autotest yazıp, aynı işlemi 1000 kere farklı şifreler ile denetip makalenin sonuna yorum olarak paylaşırsanız harika olur :) Nerde hareket orda bereket :)

      İyi çalışmalar.

  3. ÇETİN DOĞU dedi ki:

    Random şifre aramaya haksızlık olmuş. List bir siniftan remove etme işlemi ile de zaman kaybedilir olabilir. Hashset ve dictionary ile de denemek lazım. Adil olması için sıralı aramada da tumunu listeye atıp her denediginde remove etmek lazım belkide… İlk aklıma bu geldi ama belki yanlış düşündüm bir an:) güzel çalışma ama fark büyük olduğu için bir sıkıntı var gibi geldi nedense bana.

  4. Hakan dedi ki:

    Burada new Random() satırı da yavaşlamaya sebep olmuş olabilir mi ? Yani Random sayı üretmek maliyetli olduğundan da böyle bir sonuca ulaşmış olabilir mi ?

    • borsoft dedi ki:

      Selam Hakan,
      Burada şu kısım, “int index = rnd.Next(listOfPassword.Count);” maliyetli olabilir.

  5. Çağdaş İlhan dedi ki:

    Varyasyon Listini parçalara bölüp her bir parçayı bir ayrı threadde yesek Randoma yeterli nitroyu vermiş olur muyuz ? Verdiğimiz hız tükettiğimiz kaynağa değer mi ? Babam pasta yapmayı neden öğrenmedi ?

  6. Berkay dedi ki:

    Çok bilgilendiricibir yazı.

  7. Eylul dedi ki:

    Hocam çok muazzam bir anlatım elinize sağlık

  8. k dedi ki:

    üstat bu yazı ilginç ama çıkarım da bir hayli ilginç olmuş… Burada sürelere bakmak kafa karıştırıcı bir yöntem olmuş. Neden dersen?
    Senin algoritmanı ben listeden kaldırmak yerine (çünkü maliyetli bir işlem listeden çıkarmak) onun terine bir bool değişken daha tutup ona göre yapardım başkası o da güzel değil derdi başka bir şey önerirdi.. redis gibi mesela vs vs….

    ÖZET: Burada kriter süre değil kaç deneme de şifreye ulaştıkları olmalıydı! ona göre algoritmayı güçlendirme yapılabilirdi! Birisi 10.000 denemede ulaşırken diğeri yavaş ama 5000denemede ulaşıyorsa ya donanım gücünü artırırsın ya da algoritmayı iyileştirir süreyi kısaltmaya çalışırsın

    makale için teşekkürler

    • borsoft dedi ki:

      Selamlar,
      Öncelikle teşekkürler:)
      Makalenin tek amacı var, okuyana fikir vermek. Düşündürmek. Bunu da gördüğüm kadarı ile başarmış :)

      İyi çalışmalar.

  9. UGUR dedi ki:

    10000000…11111111…22222222….33333333……44444444……55555555…..66666666……77777777……8888888……99999999 ve son tabi bumların araları dolu olacAK KODMATİK ELLE URAŞTIM YAPMAYI DENEDİM AMA BELLİ BİR YERE KADAR DENEYE BİLDİM PARMAM ARIYOR KOD YAZARKEN

  10. Ruhin dedi ki:

    Bu şifreyi bulmak çok zor

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.