2010-10-04 96 views
3

我现在有一个WCF服务,其提供关于请求数据的一个对象图提供的对象创建图表在C#的哈希码。我想有一种机制,客户端可以在它所拥有的缓存对象图上计算散列,然后可以将此散列值提供给WCF服务,以查看它是否与服务拥有的数据相匹配。如何在由WCF服务

我尝试过使用标准加密算法来计算对象的散列,但由于对象定义是由服务保存的,所以当它传送给客户端时,可以添加额外的属性并且属性的顺序可能会改变,这两者都会影响产生的散列。

是否有任何其他的机制比说的WCF服务定义每个对象上覆盖的GetHashCode,然后重新执行同一种哈希生成作为客户端上的效用?

回答

1

管理现在整理了这一点。而不是使用客户端和服务器上的XMLSerialiser创建内存流,关于我改变了它要使用的WCF服务使用到连载对象图到客户端的DataContractSerializer我然后可以计算散列。这意味着对象图具有相同的结构和布局。在两个序列化表单上计算散列现在匹配。

就在这个感兴趣的是如何它的工作,我打电话这则比较字节情况下,任何人的[]与客户端提供的返回:

 private static byte[] CalculateHashCode(SomeComplexTypeDefinedAsDataContract objectGraph) 
    { 
     using (RIPEMD160 crypto = new RIPEMD160Managed()) 
     { 
      using (MemoryStream memStream = new MemoryStream()) 
      { 
       DataContractSerializer x = new DataContractSerializer(typeof(SomeComplexTypeDefinedAsDataContract)); 
       x.WriteObject(memStream, objectGraph); 
       memStream.Position = 0; 
       return crypto.ComputeHash(memStream); 
      } 
     } 
    } 
+0

我实际上改变了这个,现在使用MD5哈希,因为它更快更容易。 – gouldos 2010-12-08 16:07:36

2

你可以简单地把它序列化到一个已知的布局,并采取已知哈希序列化形式的(MD5?)。尽管如此,这需要一个可预测的序列化 - 所以XML属性会像空白一样痛苦。但不是无法克服的。

可替换地,反射/ MD5基础的方法?

+0

创建哈希(我使用RIPEMD-160 ,也许略微矫枉过正)在序列化的形式是我试图开始。虽然我只是使用标准的XmlSerialiser。由于WCF在retieval(ExtensionData)上添加了额外的属性,并且它重新命令它们,客户端上的序列化表单是不同的。你是否建议创建我自己的自定义串行器,以便我知道它们的序列化属性和顺序? – gouldos 2010-10-04 15:59:21