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

标签 c# serialization hash hashtable

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

相关文章:

java - Java和C#的构造函数执行顺序及其对代码移植的实际影响

java.io.InvalidClassException 即使使用serialVersionUID

java - 如何在java中通过一个套接字发送多个对象?

c# - 属性的内部 setter 可以序列化吗?

c# - 从 C# 调用 AuditQuerySystemPolicy() (advapi32.dll) 返回 "The parameter is incorrect"

c# - Xamarin 表单选择器级联

linux - 电子邮件地址的 sha256sum 散列

java - 按位与在 Java 哈希表哈希查找中?

c# - DevExpress MVC LabelFor - 设置 css 类

java - 阻塞或非阻塞 - 在 Java 的 HashMap 中重新散列期间添加元素