Как создать уникальный long (хэш) для объекта произвольного типа? - PullRequest
0 голосов
/ 08 ноября 2011

Моя цель - создать метод со следующими требованиями:

  • Вывод должен быть одинаковым для разных доменов приложений (но на которых установлена ​​одна и та же версия .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);
        }
}

Обратите внимание, возможная пустота ключа не учитывается.

Любые комментарии и возможные подводные камни этих реализаций приветствуются наряду с любыми другими возможными.

Спасибо

1 Ответ

1 голос
/ 09 ноября 2011

Похоже, что требования не могут быть выполнены с заявленной подписью метода, спасибо всем за ваши комментарии, особенно @Marc Gravell.

Я представлю подходящий интерфейс со свойством UniqueId, которое будут реализованы всеми ключами.

Я надеялся избежать этого, чтобы сохранить обратную совместимость, но, эй, не всегда можно получить то, что вы хотите!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...