static public class HashFunctions >>>> { >>>> public static Byte[] GetHashValue(string s) >>>> { >>>> byte[] source = ASCIIEncoding.ASCII.GetBytes(s); >>>> return new MD5CryptoServiceProvider().ComputeHash(source); >>>> } >>>> >>>> public static bool CompareHash(byte[] first, byte[] second) >>>> { >>>> bool equal = false; >>>> if (first.Length == second.Length) >>>> { >>>> int i=0; >>>> while (i < first.Length && (first[i] == second[i])) >>>> i++; >>>> equal = i == first.Length; >>>> } >>>> return equal; >>>> } >>>> >>>> public static bool CompareHash(byte[] b,string s) >>>> { >>>> return CompareHash(b, GetHashValue(s)); >>>> } >>>> }The password is stored as a byte array (varbinary() in MSSQL)
>>>namespace GregoryAdam.Base.ExtensionMethods >>>{ >>> public static partial class ExtensionMethods_Array >>> { >>> //______________________________________________________________________ >>> /// <summary> >>> /// returns whether the contents of a range are equal to another range >>> /// </summary> >>> /// <typeparam name="T"></typeparam> >>> /// <param name="thisArray"></param> >>> /// <param name="thisIndex"></param> >>> /// <param name="otherArray"></param> >>> /// <param name="otherIndex"></param> >>> /// <param name="length"></param> >>> /// <returns></returns> >>> public static bool ContentsEqual<T>(this T[] thisArray, int thisIndex, T[] otherArray, int otherIndex, int length) >>> where T : IEquatable<T> >>> { >>> if ( otherArray == null ) >>> return false; >>> >>> for (; --length >= 0; ) >>> if (!thisArray[thisIndex++].Equals(otherArray[otherIndex++])) >>> return false; >>> >>> return true; >>> } >>> //______________________________________________________________________ >>> public static bool ContentsEqual<T>( this T[] array, int index1, int index2, int length ) >>> where T : IEquatable<T> >>> { >>> return array.ContentsEqual(index1, array, index2, length); >>> } >>> //______________________________________________________________________ >>> public static bool ContentsEqual<T>( this T[] array, T[] otherArray ) >>> where T : IEquatable<T> >>> { >>> if ( otherArray == null ) >>> return false; >>> >>> if ( array.Length != otherArray.Length ) >>> return false; >>> >>> return array.ContentsEqual(array.GetLowerBound(0), otherArray, otherArray.GetLowerBound(0), array.Length); >>> } >>> //______________________________________________________________________ >>> } >>>} >>>>>
for (; --length >= 0; ) >>> if (!thisArray[thisIndex++].Equals(otherArray[otherIndex++])) >>> return false;or my:
while (i < first.Length && (first[i] == second[i]))
>> i++;
>> equal = i == first.Length;
>>public static bool ContentsEqual<T>( this T[] array, T[] otherArray ) >>
for (; --length >= 0; ) >>> if (!thisArray[thisIndex++].Equals(otherArray[otherIndex++])) >>> return false;or my:
while (i < first.Length && (first[i] == second[i]))
>> i++;
>> equal = i == first.Length;
>>namespace BaseTest >{ > > > class test2 > { > > const int nTimes = 10000; > const int ArraySize = 1024 * 64; > > //______________________________________________________________________ > static void Main() > { > > ExecuteTimed.Run(TestViv, false); // 00:00:04.86 > ExecuteTimed.Run(TestMine, false); // 00:00:05.70 > ExecuteTimed.Run(TestMine2, false); // 00:00:05.00 > ExecuteTimed.Run(TestMine3, true); //00:00:04.91 > > } > //______________________________________________________________________ > static void TestViv() > { > byte[] first = new byte[ArraySize]; > byte[] second = new byte[ArraySize]; > > for ( int times = nTimes; --times >= 0; ) > { > bool equal = false; > int i = 0; > while (i < first.Length && (first[i] == second[i])) > i++; > > equal = i == first.Length; > > > } > } > //______________________________________________________________________ > static void TestMine() > { > byte[] first = new byte[ArraySize]; > byte[] second = new byte[ArraySize]; > > for ( int times = nTimes; --times >= 0; ) > { > > int length = first.Length; > int index1 = 0, index2 = 0; > > for ( ; --length >= 0; ) > if ( !first[index1++].Equals(second[index2++]) ) > break; > > > } > } > //______________________________________________________________________ > static void TestMine2() > { > byte[] first = new byte[ArraySize]; > byte[] second = new byte[ArraySize]; > > for ( int times = nTimes; --times >= 0; ) > { > > int length = first.Length; > int index1 = 0, index2 = 0; > > for ( ; --length >= 0; ) > if ( first[index1++] != second[index2++] ) > break; > > > } > } > //______________________________________________________________________ > static void TestMine3() > { > byte[] first = new byte[ArraySize]; > byte[] second = new byte[ArraySize]; > > for ( int times = nTimes; --times >= 0; ) > { > > int length = first.Length; > int index1 = 0; > > for ( ; --length >= 0; ) > if ( first[index1] != second[index1++] ) > break; > > > } > } > //______________________________________________________________________ > } >} > >>Mine is slower- but I do not see any other way, it's generic - so I cannot use any operator (!=, ==, etc)