Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>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)</p> <p>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. </p> <p>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.</p> <p>call the following with a call like this:</p> <pre><code>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 &lt; repetitions; i++) { goo[i] = new byte[size]; rng.GetBytes(goo[i]); } DateTime start = DateTime.Now; for (UInt64 i = 0; i &lt; repetitions; i++) { engine.ComputeHash(goo[i]); } return DateTime.Now.Subtract(start).Ticks; } </code></pre> <p>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):</p> <pre><code>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 &lt; 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 </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload