簡體   English   中英

確保兩個字符數組不相同

[英]ensure two char arrays are not the same

我隨機生成一個字符網格並將其存儲在char [,]數組中...

我需要一種方法來確保在以二進制格式將其序列化到數據庫之前尚未生成網格...什么是基於字節比較兩個網格的最佳方法? 我想做的最后一件事是遍歷它們的內容,因為我已經以字節形式從數據庫中拉出了其中一個。

我在考慮校驗和,但不確定是否可行。

char[,] grid = new char[8,8];
char[,] secondgrid = new char[8,8];//gets its data from db

從我所看到的,您將不得不遍歷內容(或至少一部分內容); 沒有別的談論數組內容的方法。

好吧,作為一種快速的“絕對不一樣”,您可以在數組上計算哈希值,即:

    int hash = 7;
    foreach (char c in data) {
        hash = (hash * 17) + c.GetHashCode();
    }

這可能會有一些誤報的風險(在唯一的情況下報告dup),但否則價格不菲。 有什么用嗎 您可以將散列與數據一起存儲在數據庫中以進行快速檢查-但是,如果這樣做,您應該為char選擇自己的散列算法(因為不能保證保持不變)-也許只是轉換為int,例如-或重新使用現有的實現:

    int hash = 7;
    foreach (char c in data) {
        hash = (hash * 17) + (c | (c << 0x10));
    }

順便說一句-對於8x8,您始終可以只考慮64個字符串,而只需檢查== 這在數據庫和應用程序上同樣有效。

您不能讓數據庫來做嗎? 使網格列為唯一。 然后,如果需要檢測是否生成了重復的網格,執行此操作的方法可能涉及檢查受操作影響的行數,或者測試錯誤。

另外,如果只是簡單地從[0,255]中隨機選擇每個字節,那么執行哈希以獲取4字節的數字並不比將前四個字節從網格中取出更好。 碰撞的機會是相同的。

我會采用校驗和/哈希機制來捕獲很大一部分匹配項,如果得到匹配項,則進行全面比較。

用於填充網格的字符范圍是多少? 如果您只使用字母(不區分大小寫,也不區分大小寫)和8x8網格,那么假設哈希值良好,那么您在問題空間中每件商品可能只發生7次左右的碰撞(這種情況很少發生)功能。 您可以執行以下操作:

  1. 生成網格
  2. 從數據庫加載任何匹配的網格
  3. 如果發現與#2相匹配,則轉到1
  4. 使用新的網格。

嘗試以下操作(為每個矩陣調用ComputeHash並比較向導):

private static MD5 md5 = MD5.Create();
public static Guid ComputeHash(object value)
{
    Guid g = Guid.Empty;
    BinaryFormatter bf = new BinaryFormatter();
    using (MemoryStream stm = new MemoryStream())
    {
        bf.Serialize(stm, value);
        g = new Guid(md5.ComputeHash(stm.ToArray()));
        stm.Close();
    }
    return g;
}

注意:因為有char數組,所以生成字節數組的過程可能要簡單得多。

暫無
暫無

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

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