[英]Create a simple hash value of database columns using c# .net
我想存儲n個列的簡單哈希值,例如地址和名稱,並將哈希存儲在另一列中。 我想通過簡單地比較哈希值,使用哈希值作為在兩個源之間同步數據的快速方法。 做這樣的事情的最佳方式是什么。 我不需要加密功能來創建哈希。
例如
John Smith,1 Long Lane Road,Village,Town,Postcode。 哈希:AK67KS38
我希望哈希值足夠簡單,可讀(沒有整個Uni代碼集)。
編輯確定我仍然希望在c#代碼和LINQ中執行此操作。 通過詢問其他來源將數據引入外部。 沒有其他方法可以將此唯一鏈接與我的數據相關聯,因為從外部源鏈接到沒有“密鑰”。 所以從這個意義上說,時間戳值不是一個選項。 我知道這種方法並不“精確”,但我可以忍受。 我可以添加手動審查可能的哈希匹配的功能,並在可接受的情況下將它們進一步提升到數據庫中。
Jon - 另一種方法是在表(或對象)中添加時間戳列。 將其設置為UTC並完成它。 當然,您可以在編輯等方面爭論並發性,但如果您只是比較哈希列值,那么確定最新的編輯/差異將會困難得多。
但是,如果哈希列方法是'必須',那么在不同文化的數據庫安裝中你應該非常小心,因為機制可能會有所不同。 在這種情況下,我會仔細考慮時間戳與散列的優點。
[編輯] Jon,基於你最近的編輯,我建議你在你的對象上創建一個自定義的GetHashCode()和Equals(),並使用comparer為你做咕嚕咕嚕的工作。 我做了一個快速的谷歌來計算可能有用的東西。 一個合理的(2分鍾谷歌)起點可能在這里:
http://www.eggheadcafe.com/community/aspnet/2/78458/hashcode.aspx
這是一個快速的代碼示例(根據您對哈希[謝謝resharper :-)]使用的名稱和地址的要求):
public class ContactDetails
{
public string Name { get; set; }
public string Address { get; set; }
public string Village { get; set; }
public string Town { get; set; }
public string PostCode { get; set; }
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != typeof (ContactDetails)) return false;
return Equals((ContactDetails) obj);
}
public bool Equals(ContactDetails other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return Equals(other.Name, Name) && Equals(other.Address, Address);
}
public override int GetHashCode()
{
unchecked
{
return ((Name != null ? Name.GetHashCode() : 0)*397)
^ (Address != null ? Address.GetHashCode() : 0);
}
}
}
典型用法:
bool isChanged = ContactFromServer1.Equals(ContactFromServer2);
//etc..
希望這可以幫助
假設您的列被復制到User實例(用戶):
DataContractSerializer serializer = new DataContractSerializer(typeof(User));
MemoryStream memoryStream = new MemoryStream();
XmlWriter writer = XmlDictionaryWriter.CreateBinaryWriter(memoryStream);
serializer.WriteObject(memoryStream, user);
byte[] serializedData = memoryStream.ToArray();
// Calculte the serialized data's hash value
SHA1CryptoServiceProvider SHA = new SHA1CryptoServiceProvider();
byte[] hash = SHA.ComputeHash(serializedData);
// Convert the hash to a base 64 string
string hashAsText = Convert.ToBase64String(hash);
請注意,我已將哈希轉換為基本64字符串,並且您也可以使用MD5,因為哈希是為校驗和目的計算的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.