簡體   English   中英

將Object.GetHashCode()轉換為Guid

[英]Converting Object.GetHashCode() to Guid

我需要為應用程序啟動和關閉時管理狀態的對象分配一個guid看起來我可以使用字典將查找值存儲在字典中

dictionary<int,Guid>.Add(instance.GetHashCode(), myGUID());

這里有什么潛在的問題需要注意嗎?

注意

這不需要在執行運行之間持續存在,只需要像這樣的guid

  • 創建對象
  • gethashcode(),與新的或舊的guid相關聯
  • 在應用程序終止之前,gethashcode()和查找guid以更新()或插入()到持久性引擎USING GUID

    唯一的假設是gethashcode()在進程運行時保持一致

    在相同的對象類型(從窗口派生)上調用gethashcode()

更新2 - 這是更大的圖片

  • 創建一個狀態機,以便在運行之間存儲有關WPF用戶控件(后來引用為UC)的信息
  • 用戶控件的類型可以隨時間變化(添加/刪除)
  • 在第一次運行中,沒有先前狀態,用戶與U​​C的子集交互並修改其狀態,需要在應用重啟時重新創建
  • 當應用程序正常關閉時,將拍攝此狀態快照
  • 也可以有多種UC類型的實例
  • 在關機時,每個實例都會分配一個guid,並與類型信息和狀態信息一起保存
  • 所有這些guid也存儲在一個集合中
  • 在重新啟動時,為每個guid,創建對象,存儲ref / guid,恢復每個實例的狀態,以便應用程序看起來與以前完全一樣
  • 用戶可以添加或刪除UC實例/類型,否則與系統交互
  • 在關機時,狀態再次被保存
  • 此時的選擇是刪除/刪除所有先前狀態並將新狀態信息插入持久層(sql db)
  • 隨着時間的觀察/分析,事實證明很多實例保持一致/靜態並且不會改變 - 所以它們的狀態不需要再次刪除/插入,因為狀態信息現在非常大並且存儲在非本地數據庫上
  • 所以只保留更改增量
  • 要計算增量,需要跟蹤參考生命周期
  • 當前在啟動時存儲為List<WeakReference>
  • 在關機時,遍歷此列表並在屏幕上顯示實際UC,相應地添加/更新/刪除密鑰
  • 將delta發送到持久性

希望上面說清楚。

所以現在的問題是 - 為什么不只是存儲HashCode(僅用戶控件)而不是WeakReference並在通過列表迭代時消除空引用的測試

更新3 - 謝謝所有,最后將使用弱引用

您似乎假設哈希碼是唯一的。 散列碼不起作用。 有關更多詳細信息,請參閱Eric Lippert 關於GetHashCode指南和規則的博客文章,但基本上您應該只為保持良好行為的類型做出假設 - 即如果兩個對象具有不同的哈希碼,則它們肯定是不相等的。 如果它們具有相同的哈希碼,則它們可能相等,但可能不相同。

編輯:如上所述,您也不應該在執行運行之間保留哈希碼。 面對重啟,無法保證他們會保持穩定。 目前還不是很清楚你正在做什么,但這聽起來不是一個好主意。

編輯:好的,你現在已經注意到它不會持久,所以這是一個好的開始 - 但你仍然沒有處理哈希碼沖突的可能性。 你為什么要調用GetHashCode() 為什么不添加對字典的引用?

使用GetHashCode來平衡哈希表 這就是它的用途。 不要將它用於其他非設計用途的目的; 那很危險

快速簡便的修復似乎是

var dict = new Dictionary<InstanceType, Guid>();
dict.Add(instance, myGUID());

當然,如果還沒有正確實現InstanceType.Equals。 (或實現IEQuatable<InstanceType>

我能想到的可能問題:

  • 散列碼沖突可以為您提供重復的字典鍵
  • 不同對象的哈希算法可以為兩個功能不同的對象提供相同的哈希碼; 你不會知道你正在使用哪個對象
  • 這種實現容易模糊(如上所述); 您可能需要存儲有關對象的更多信息,而不僅僅是它們的哈希碼。

注 - Jon更優雅地說( 見上文

由於這是針對WPF控件的,為什么不將Guid添加為依賴項預測呢? 您似乎已經在迭代用戶控件,以獲取其哈希碼,因此這可能是一個更簡單的方法。

如果你想捕獲一個控件被刪除以及它有哪個Guid,那么訂閱關閉/刪除事件的一些管理器對象只是存儲Guid和其他一些細節將是一個好主意。 然后,如果需要,您還可以更輕松地捕獲更多詳細信息以進行分析。

暫無
暫無

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

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