2012-08-07 24 views
1

可能重複:
Good GetHashCode() override for List of Foo objects我怎麼能轉換列表<object>獨特的ID

我有ObjectsList,對象有ID,文件名,狀態(枚舉),時間戳,用戶ID 。
使用Linq我過濾List使用UserId並將其發送到Web App。

我需要獲得某種Unique Id的篩選結果,並在下次比較它以檢測當前用戶的更改。如果爲當前用戶或現有對象的屬性添加的新對象更改Unique Id應該不同。

我試圖使用下面的代碼來獲取哈希代碼,但哈希代碼是不同的每個MyList對象,即使對象和對象的屬性是相同的。請有任何想法嗎?

myList= _queueList.GetItems(p => p.User.Id == userId) 
        .OrderByDescending(p => p.DateStamp) 
        .ToList(); 

myList.GetHashCode() 
+2

僅供參考哈希碼並不是唯一的。 – 2012-08-07 13:46:16

+0

@ DanielA.White對此用法無關緊要 - 唯一的要求是如果數據更改了id更改。數據發生變化的可能性,但散列保持不變的可能性是微乎其微的。這種用法應該是可以接受的。 – karaken12 2012-08-07 13:50:53

+0

@ karaken12重點是這不是GetHashCode()的用途。如果列表提供了一個除Object.GetHashCode()之外的實現,我不會告訴你有關內容的唯一性。 – drch 2012-08-07 14:01:33

回答

1

你可以利用內建的加密這樣的:

string hash = Convert.ToBase64String(
    new SHA1CryptoServiceProvider().ComputeHash(
     Encoding.UTF8.GetBytes(
      string.Join(":", myList.Select(obj => obj.Id.ToString()).ToArray() 
     ))); 

我把Convert.ToBase64String(),使其Web友好(注意:生成的字符串可能變得很長,如果你有很多記錄)

1
var uniqueId = string.Join(",", myList.Select(x=>x.Id.ToString()).ToArray()); 

如果字符串很長,你可以生成一個MD5或SHA-1,並返回來代替。

相關問題