【发布时间】:2011-12-27 04:18:00
【问题描述】:
我正在研究一个专门的磁盘哈希表(之前对 Berkeley、ManagedESENT 等的实验没有成功)。它有一个相当简单的链式结构,文件中的每个键值对 (KVP) 后跟一个长 (Int64) 值,该值指向链中的下一个 KVP(如果没有,则使用零值) )。我正在使用 MD5 生成哈希码。
在分析代码以评估添加条目的速度时,散列函数负责大约 55% 的运行时间,这不足为奇。但是大约 25% 的 时间来自 ObjectToByteArray 序列化函数中的 binForm.Serialize(ms, obj) 调用。这两个功能如下所示。我假设我无法在哈希算法本身上获得任何大的收益,但我想知道我是否可以从序列化函数中获得一些性能?
// 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();
}
【问题讨论】:
-
我认为您不必使用复杂的哈希函数,例如 md5。你甚至可以使用
ObjectToByteArray(s).GetHashCode(),因为它不必像!unique!那样像md5 -
这很有趣。除了我可以获得的任何序列化收益之外,我会试一试,看看它是否会加快速度。谢谢。
-
这是Json序列化器+BinaryFormatter的性能对比codeproject.com/KB/IP/fastJSON.aspx
-
我研究了 fastJSON,但无法弄清楚它如何用作二进制序列化程序(即如何产生一个字节 [])。
-
当然,因为它不是二进制序列化器。它将您的对象转换为 Json 字符串 然后您可以获得 byte[] 为
Encoding.UTF8.GetBytes(jsonstring)
标签: c# serialization hash hashtable