我正在研究一种专门的磁盘哈希表(之前的实验与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(); }
解决方法
使用protobuf.net,发现
here,它快得多!
更新
从查看代码开始,我假设没有任何计算哈希在AppDomains中保持一致的要求?如果不计算您的HashCode可以像下面这样简单:
private static long GenerateHash(object key) { long typeHash = key.GetType().GetHashCode(); long keyHash = key.GetHashCode(); return (typeHash << 32) + keyHash; }
为了将来参考,你的MemoryStream应该真的在一个使用块中,否则你冒着泄漏内存的风险:
private byte[] ObjectToByteArray(Object obj) { if (obj == null) return null; using (MemoryStream ms = new MemoryStream()) { binForm.Serialize(ms,obj); return ms.ToArray(); } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。