gpt4 book ai didi

c# - 提高序列化/哈希函数的性能

转载 作者:行者123 更新时间:2023-11-30 12:33:59 26 4
gpt4 key购买 nike

我正在研究一个专门的磁盘哈希表(之前使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com