我正在研究一个专门的磁盘哈希表(之前使用 Berkeley、ManagedESENT 等进行的实验没有成功)。它有一个相当简单的链式结构,文件中的每个键值对 (KVP) 后跟一个指向链中下一个 KVP 的长值 (Int64)(如果没有则使用零值) ).我正在使用 MD5 生成哈希码。
在分析代码以评估添加条目的速度时,散列函数占用了大约 55% 的运行时间,这并不奇怪。但大约 25% 的时间来自 ObjectToByteArray
序列化函数中的 binForm.Serialize(ms, obj)
调用。这两个函数如下所示。我假设我不能在哈希算法本身上获得任何大的 yield ,但我想知道我是否可以从序列化函数中获得一些性能?
// Compute hash code
long hash(object s)
{
byte[] y = md5.ComputeHash(ObjectToByteArray(s)); // Produces byte[16]
long z = BitConverter.ToInt64(y, 0);
long res = z & bitMask;
return res;
}
// Convert an object to a byte array
private byte[] ObjectToByteArray(Object obj)
{
if (obj == null)
return null;
MemoryStream ms = new MemoryStream();
binForm.Serialize(ms, obj);
return ms.ToArray();
}
最佳答案
使用protobuf.net,发现here ,它要快得多!
更新
通过查看您的代码,我假设没有要求计算的哈希值在 AppDomain 之间保持一致?如果不计算你的 HashCode 可以很简单:
private static long GenerateHash(object key)
{
long typeHash = key.GetType().GetHashCode();
long keyHash = key.GetHashCode();
return (typeHash << 32) + keyHash;
}
为了将来引用,您的 MemoryStream 应该真正位于 using block 中,否则您将面临内存泄漏的风险:
private byte[] ObjectToByteArray(Object obj)
{
if (obj == null)
return null;
using (MemoryStream ms = new MemoryStream())
{
binForm.Serialize(ms, obj);
return ms.ToArray();
}
}
关于c# - 提高序列化/哈希函数的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8097073/