簡體   English   中英

使用c#.net創建數據庫列的簡單哈希值

[英]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.

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