c# – 提高序列化散列函数的性能

c# – 提高序列化散列函数的性能,第1张

概述我正在研究一种专门的磁盘哈希表(之前的实验与Berkeley,ManagedESENT等没有成功).它有一个相当简单的链式结构,每个键值对(KVP)在文件中跟随一个长(Int64)值,指向链中的下一个KVP(如果没有一个,则使用零值) ).我正在使用MD5生成哈希码. 在分析代码以评估添加条目的速度时,散列函数负责大约55%的运行时间,这并不奇怪.但是大约25%的时间来自ObjectToByteA 我正在研究一种专门的磁盘哈希表(之前的实验与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();    }   }
总结

以上是内存溢出为你收集整理的c# – 提高序列化/散列函数的性能全部内容,希望文章能够帮你解决c# – 提高序列化/散列函数的性能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1234093.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存