CNG, CryptoServiceProvider and Managed implementations of HashAlgorithm

后端 未结 4 1694
不思量自难忘°
不思量自难忘° 2020-12-31 00:02

So I was wondering if there are any major differences between the various implementations of the hash algorithms, take the SHA series of algorithms for example. All of them

4条回答
  •  醉梦人生
    2020-12-31 00:54

    The Cng versions are supposed to be a little faster, but I just wrote up a little program that compares the speeds of each. (I had a client that was asking about the performance characteristics of MD5 vs. SHA1)

    I was surprised to find out there is little to no difference between MD5 and SHA1, but was also surprised that there is a slight difference in Cng and the CryptoServiceProvider.

    The source is pretty straight forward, I added reps to do the same iteration multiple times so I could average in case there was any weirdness going on, on my machine during one of the runs.

    call the following with a call like this:

    CalculateHash(1, 1024, new SHA1CryptoServiceProvider());
    
    static long CalculateHash(UInt64 repetitions, UInt64 size, HashAlgorithm engine)
        {
            RandomNumberGenerator rng = RandomNumberGenerator.Create();
    
            byte[][] goo = new byte[repetitions][];
            for (UInt64 i = 0; i < repetitions; i++)
            {
                goo[i] = new byte[size];
                rng.GetBytes(goo[i]);
            }
    
            DateTime start = DateTime.Now;
            for (UInt64 i = 0; i < repetitions; i++)
            {
                engine.ComputeHash(goo[i]);
            }
            return DateTime.Now.Subtract(start).Ticks;
        }
    

    I ran this in a loop of increasing size to figure out if one fell over when using large or small inputs. Here is the loop, and the data follows (my computer ran out of ram at 2^28):

    int loops = 32;
            UInt64 reps = 1;
    
            int width = 20;
            Console.WriteLine("Loop#".PadRight(6) +
                    "MD5".PadRight(width) +
                    "SHA1".PadRight(width) +
                    "SHA1Cng".PadRight(width) +
                    "SHA256".PadRight(width) +
                    "SHA256Cng".PadRight(width));
    
            for (int i = 0; i < loops; i++)
            {
                UInt64 size = (UInt64)Math.Pow((double)2, (double)i);
    
                Console.WriteLine((i + 1).ToString().PadRight(6) +
                    CalculateHash(reps, size, new MD5CryptoServiceProvider()).ToString().PadRight(width) +
                    CalculateHash(reps, size, new SHA1CryptoServiceProvider()).ToString().PadRight(width) +
                    CalculateHash(reps, size, new SHA1Cng() ).ToString().PadRight(width) +
                    CalculateHash(reps, size, new SHA256CryptoServiceProvider()).ToString().PadRight(width) +
                    CalculateHash(reps, size, new SHA256Cng()).ToString().PadRight(width));
            }
    
    Loop# MD5         SHA1        SHA1Cng     SHA256      SHA256Cng
    1     50210       0           0           0           0
    2     0           0           0           0           0
    3     0           0           0           0           0
    4     0           0           0           0           0
    5     0           0           0           0           0
    6     0           0           0           0           0
    7     0           0           0           0           0
    8     0           0           0           0           0
    9     0           0           0           0           0
    10    0           0           10042       0           0
    11    0           0           0           0           0
    12    0           0           0           0           0
    13    0           0           0           0           0
    14    0           0           0           0           0
    15    10042       0           0           10042       10042
    16    10042       0           0           0           0
    17    0           0           0           10042       10042
    18    0           10042       10042       20084       10042
    19    0           10042       10042       30126       40168
    20    20084       20084       20084       70294       70294
    21    30126       40168       40168       140588      140588
    22    60252       70294       80336       291218      281176
    23    120504      140588      180756      572394      612562
    24    241008      281176      361512      1144788     1215082
    25    482016      572394      723024      2289576     2420122
    26    953990      1134746     1456090     4538984     4830202
    27    1907980     2259450     2982474     9118136     9660404
    28    3805918     4508858     5804276     18336692    19581900
    

提交回复
热议问题