1. 程式人生 > >記一次MD5妙用

記一次MD5妙用

更改 利用 嵌入式 當前 項目組 行記錄 存儲 方案 介紹

記一次MD5妙用

最近項目組中在做歷史記錄的改造工作,主持討論了多次,但每次討論完都覺的很完美了,但實際在寫這部分邏輯的時候還是會發現一些問題出來,很難受,反反復復的暴露智商是硬傷,人艱不拆,暫先不扯這些真相了。介紹下實際操作場景,我們的項目是分設計端和運行端的,就是設計端設計的內容保存在數據文件中,運行端去解析該文件,展示設計的內容,其中歷史記錄部分就是其中一項功能,該功能包括采集外部設備的數據,以及使用表格和曲線來展示數據。但這裏有一個要求就是,同一個工程的歷史數據文件不能每次下載就新建這個歷史數據文件,必須要判斷有無更改了歷史記錄配置,如果有更改則可以重建,否則就不能新建去存儲,第一次討論時就已經考慮到這一點了,確定了是由運行端去比較是否有更改。運行端人員寫了一下,發現這個比較很麻煩,因為運行端是在一個嵌入式設備上運行的,內存,硬盤這些都很小,cpu處理也很慢,不僅麻煩,而且運行處理速度也很慢,提出由設計端人員給個標誌位,這就是第二次討論的時候提到的,設計端給出的方案是每次有編輯歷史記錄部分就置位某個值,下載後,就復位該值。這對於設計端來說也簡單,就定了。後面又發現,咱這個設計的數據文件是可以下載到多臺設備上的,每次下載完就復位的話,下載到另一臺的時候不就沒有這個標誌位了嘛,這不行啊,同一工程導致兩種運行端解析方式,這是不可接受的。然後進行了第三次討論,有提到說使用歷史記錄修改版本來區分開來,這是一個感覺還不錯的方式。下載到設備上後,設備用當前的那個工程的歷史記錄版本號與最新的下載的工程中的歷史記錄版本號進行比對,如果不一樣就可以新建,否則不新建,可接著進行記錄。這個方式是解決了之前那個問題,但又發現新的問題來,就是設計端更改了歷史記錄配置後保存,然後又更改歷史記錄配置,使之和原來的設置是一樣的,這時候版本是有更新的,但實際配置沒有變化,如果這種情況下載進去,歷史數據又新建,顯然是不合適的。忽然靈光一閃,這個場景熟悉,判斷前後設置是否有修改,可以使用md5計算一下配置信息存在某個地方,下載到設備上後,設備對這個md5值和原來配置的那個記錄進行比較,如果相同,則無需新建,否則新建,這個處理方式就避免了更改了配置,又將配置還原為原來配置的問題,這裏利用了md5一對一的特點,巧妙的解決了這個問題。但願這次的討論能夠周全了。2018-09-27 18:21:00

最後附上C#中對MD5的計算方法

public static string GetMD5String(string str)
{
    MD5 md5 = MD5.Create();
    byte[] data = Encoding.UTF8.GetBytes(str);
    byte[] data2 = md5.ComputeHash(data);
    return GetByteToString(data2);
}
public static string GetByteToString(byte[] data)
{
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i < data.Length; i++)
    {
        sb.Append(data[i].ToString("x2"));
    }
    return sb.ToString();
}

記一次MD5妙用