Моя цель - создать метод со следующими требованиями:
- Вывод должен быть одинаковым для разных доменов приложений (но на которых установлена одна и та же версия .Net framework)
- Объекты разных типов не должны генерировать один и тот же хэш
- Столкновения крайне маловероятны
- Метод будет вызываться довольно часто, поэтому не должен быть слишком медленным
Реализации, которые я рассматриваю, выглядят примерно так:
private static long GenerateHash<TKey>(TKey key)
{
long typeHash = typeof(TKey).GetHashCode();
long keyHash = key.GetHashCode();
return (typeHash << 32) + keyHash;
}
и
private static long GenerateHash<TKey>(TKey key)
{
using (var stream = new MemoryStream())
{
var formatter = new BinaryFormatter(); // Or other serialiser
formatter.Serialize(stream, key);
stream.Seek(0, SeekOrigin.Begin);
var hashAlgorithm = new SuitableHashAlgorithm(); // Not real class, need to find/write a hash algorithm that can compute 64 bit hashes...
var hash = hashAlgorithm.ComputeHash(stream);
return BitConverter.ToInt64(hash, 0);
}
}
Обратите внимание, возможная пустота ключа не учитывается.
Любые комментарии и возможные подводные камни этих реализаций приветствуются наряду с любыми другими возможными.
Спасибо