如何为任意类型的对象生成唯一的long(哈希)?

时间:2011-11-08 11:00:39

标签: c# c#-4.0 hash

我的目标是创建一个具有以下要求的方法:

  • 输出应该在不同的应用程序域之间保持一致(但运行相同版本的.Net框架)
  • 不同类型的对象不应生成相同的哈希值
  • 碰撞极不可能
  • 该方法将被相当频繁地调用,所以不应该太慢

我正在考虑的实现类似于:

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 个答案:

答案 0 :(得分:1)

似乎所述方法签名无法满足要求,非常感谢您的评论,尤其是@Marc Gravell。

我将介绍一个具有UniqueId属性的合适接口,所有密钥都将实现该接口。

我希望避免这种情况以保持向后兼容性,但嘿嘿,你不能总是得到你想要的东西!