Самый быстрый алгоритм хеширования на ваше мнение - C#
Формулировка задачи:
Добрый день! Нужно быстро взять хеши примерно 30 тысяч файлов. Какой алгоритм больше подойдет для такой цели на ваше мнение?
Попробовал немного(CRC32, md5 и еще один внизу написал). Из них быстрей всего справляется crc32.
public static unsafe string Calculate(Byte[] dataToHash)
{
Int32 dataLength = dataToHash.Length;
if (dataLength == 0)
return "";
UInt32 hash = (UInt32)dataLength;
Int32 remainingBytes = dataLength & 3; // mod 4
Int32 numberOfLoops = dataLength >> 2; // div 4
fixed (byte* firstByte = &(dataToHash[0]))
{
/* Main loop */
UInt16* data = (UInt16*)firstByte;
for (; numberOfLoops > 0; numberOfLoops--)
{
hash += *data;
UInt32 tmp = (UInt32)(*(data + 1) << 11) ^ hash;
hash = (hash << 16) ^ tmp;
data += 2;
hash += hash >> 11;
}
switch (remainingBytes)
{
case 3: hash += *data;
hash ^= hash << 16;
hash ^= ((UInt32)(*(((Byte*)(data)) + 2))) << 18;
hash += hash >> 11;
break;
case 2: hash += *data;
hash ^= hash << 11;
hash += hash >> 17;
break;
case 1:
hash += *((Byte*)data);
hash ^= hash << 10;
hash += hash >> 1;
break;
default:
break;
}
}
/* Force "avalanching" of final 127 bits */
hash ^= hash << 3;
hash += hash >> 5;
hash ^= hash << 4;
hash += hash >> 17;
hash ^= hash << 25;
hash += hash >> 6;
return hash.ToString();
}
Забыл пометить, что код который я привел называется SuperFastHash
http://landman-code.blogspot.ca/2008...aul-hsieh.html
Решение задачи: «Самый быстрый алгоритм хеширования на ваше мнение»
textual
Листинг программы
public static int Calculate(byte[] dataToHash)
{
int[] data = new int[dataToHash.Length / 4 + (dataToHash.Length % 4 == 0 ? 0 : 1)];
System.Buffer.BlockCopy(dataToHash, 0, data, 0, dataToHash.Length);
var hash = dataToHash.Length;
for (int x = 0; x < data.Length; x += 1)
{
hash ^= data[x];
}
return hash;
}