我的目标是创建一个具有以下要求的方法:
我正在考虑的实现类似于:
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);
}
}
注意,密钥的可能无效性不是考虑因素。
这些实现的任何评论和潜在缺陷都会与其他可能的实施一起受到欢迎。
由于
答案 0 :(得分:1)
似乎所述方法签名无法满足要求,非常感谢您的评论,尤其是@Marc Gravell。
我将介绍一个具有UniqueId属性的合适接口,所有密钥都将实现该接口。
我希望避免这种情况以保持向后兼容性,但嘿嘿,你不能总是得到你想要的东西!