2015-09-27 34 views
7

Daha önce kodlarken SHA256 hakkında garip bir şey fark ettim, çünkü bu, karma için harflerden daha fazla tamsayı üretiyor gibi görünüyor. İlk başta sadece hayal ettiğimi düşündüm, bu yüzden emin olmak için hızlı bir test yaptım. Şaşırtıcı bir şekilde, benim testim SHA256'nın yarattığı karmadaki tamsayı değerlerini desteklediğini kanıtlıyor. Bunun neden olduğunu bilmek istiyorum. Hash indeksi ile harf arasındaki fark tam olarak aynı değil mi? İşte benim test örneği:SHA256 tam sayıları destekliyor mu?

namespace TestingApp 
{ 
    static class Program 
    { 
     private static string letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 
     private static char[] characters = letters.ToCharArray(); 
     private static Random _rng = new Random(); 

     static void Main(string[] args) 
     { 
      int totalIntegers = 0; 
      int totalLetters = 0; 
      for (int testingIntervals = 0; testingIntervals < 3000; testingIntervals++) 
      { 
       string randomString = NextString(10); 
       string checksum = DreamforceChecksum.GenerateSHA256(randomString); 
       int integerCount = checksum.Count(Char.IsDigit); 
       int letterCount = checksum.Count(Char.IsLetter); 
       Console.WriteLine("String: " + randomString); 
       Console.WriteLine("Checksum: " + checksum); 
       Console.WriteLine("Integers: " + integerCount); 
       Console.WriteLine("Letters: " + letterCount); 
       totalIntegers += integerCount; 
       totalLetters += letterCount; 
      } 
      Console.WriteLine("Total Integers: " + totalIntegers); 
      Console.WriteLine("Total Letters: " + totalLetters); 
      Console.Read(); 
     } 

     private static string NextString(int length) 
     { 
      StringBuilder builder = new StringBuilder(); 
      for (int i = 0; i < length; i++) 
      { 
       builder.Append(characters[_rng.Next(characters.Length)]); 
      } 
      return builder.ToString(); 
     } 
    } 
} 

ve benim sağlama/karma sınıfı: Ben benim test birden çok kez koştu sahip, her zaman daha tamsayılar harften karma dahilinde oluşturulan görünüyor

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Security.Cryptography; 
using System.Text; 
using System.Threading.Tasks; 

namespace DreamforceFramework.Framework.Cryptography 
{ 
    public static class DreamforceChecksum 
    { 
     private static readonly SHA256Managed _shaManagedInstance = new SHA256Managed(); 
     private static readonly StringBuilder _checksumBuilder = new StringBuilder(); 
     public static string GenerateSHA256(string text) 
     { 
      byte[] bytes = Encoding.UTF8.GetBytes(text); 
      byte[] hash = _shaManagedInstance.ComputeHash(bytes); 
      _checksumBuilder.Clear(); 
      for (int index = 0; index < hash.Length; index++) 
      { 
       _checksumBuilder.Append(hash[index].ToString("x2")); 
      } 
      return _checksumBuilder.ToString(); 
     } 

     public static byte[] GenerateSHA256Bytes(string text) 
     { 
      byte[] bytes = Encoding.UTF8.GetBytes(text); 
      byte[] hash = _shaManagedInstance.ComputeHash(bytes); 
      _checksumBuilder.Clear(); 
      for (int index = 0; index < hash.Length; index++) 
      { 
       _checksumBuilder.Append(hash[index].ToString("x2")); 
      } 
      return Encoding.UTF8.GetBytes(_checksumBuilder.ToString()); 
     } 

     public static bool ValidateDataIntegrity(string data, string targetHashcode) 
     { 
      return GenerateSHA256(data).Equals(targetHashcode); 
     } 
    } 
} 

.

enter image description here

enter image description here

enter image description here

bilen var mı SHA256 numaralarını yerine harf ve rakamlardan hem eşit dağılımını lehine görünüyor neden: Burada 3 test çalışmaları nelerdir?

+1

SHA-256 (hemen hemen tüm karmalar gibi) ham bayt çıktılar. Bunlar, yalnızca kodlama uygularken karakterlere dönüşür, sizin durumunuzda hex. Karakterlerin dağıtımı, bu kodlamanın bir özelliğidir. – CodesInChaos

cevap

25

10 rakam ve 6 harfin olduğu düşünüldüğünde, orantının kabaca 10: 6 olması gerekir. Sonuçlarınız doğrultusunda bu doğru.

+0

0-9a-f'nin her biri eşit olarak dağıtılır. – mksteve

+3

Dostum, bunu nasıl özledim? – Krythic

2

Çıktı onaltılıdır. 0-9 ve a-f