簡體   English   中英

是否有可能在對象的二進制序列化(二進制)期間保存對象的哈希碼?

[英]Is there a chance of saving the hashcode of an object during its binary serialization (binary)?

我希望能夠通過哈希碼比較對象。

例如,一個是對象本身,另一個是序列化(二進制)然后恢復對象的版本。

如何將哈希保存在序列化(二進制)對象中?

為什么要序列化哈希碼? 相反,您應該在對象中提供GetHashCode()Equals()的正確實現,該實現允許您根據兩個對象的值比較兩個對象-如果兩個對象相等,則它們的哈希碼必須匹配。 因此,一旦反序列化了該對象,就可以在其上使用GetHashCode()並將其與另一個對象進行比較。 請注意,兩個哈希碼匹配的事實不足以確定相等性,但它們可能仍然不同-您必須調用Equals()的適當實現來確定相等性。

如果您只想比較對象中的自定義字段,而完全比較可能太昂貴(即大型二進制數組),那么在該字段上生成MD5哈希值(例如,使用MD5CryptoServiceProvider.ComputeHash() )並存儲該值就MD5CryptoServiceProvider.ComputeHash() 。在對象本身中,它將像其他任何對象屬性一樣被序列化。

警惕!

.Net對象的默認HashCode通常在程序的運行時實例之間更改。

換句話說,如果您的程序將帶有哈希碼的對象A序列化到光盤上,則該程序終止,然后重新啟動,然后從光盤上反序列化對象A (或在運行時創建相同的對象A )。 ,它將具有存儲的哈希碼不同的哈希碼。

這部分是因為默認哈希碼來自對象上的垃圾收集器信息。 在新的程序實例中,GC將具有不同的信息,因此具有不同的哈希碼。

如果您編寫自己的GetHashCode ,則可以創建在各個進程之間保持一致的哈希碼。 但是您需要注意一個陷阱。

有什么信息可用來告訴您哪些對象已從哪些原始文件進行序列化和反序列化? 如果是這樣,則可以重寫GetHashCode()以基於該信息計算哈希碼。

如果沒有,您可以通過為每個新創建的對象分配一個UUID來綜合生成一個。 將該值與其他數據一起序列化,以便重建的對象具有相同的UUID。 然后,您可以簡單地重寫GetHashCode()以返回該UUID的哈希碼。 (如果您要查找的是參照相等性的一種修改版本,則可以完成此工作。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM