确保两个char数组不一样

时间:2009-04-15 06:35:36

标签: c# .net

我随机生成一个字符网格并将其存储在char [,]数组中......

我需要一种方法来确保在将数据库以二进制格式序列化到数据库之前我还没有生成网格...基于字节比较两个网格的最佳方法是什么?我想要做的最后一件事就是遍历它们的内容,因为我已经从字节形式的db中提取了其中一个。

我在考虑校验和,但不确定这是否有用。

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

4 个答案:

答案 0 :(得分:2)

从我所看到的,你将拥有来遍历内容(或者至少是其中的一部分);没有其他方式可以讨论数组内容。

嗯,作为一个快速的“绝对不一样”你可以计算数组的哈希值 - 比如:

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

这有一些误报的风险(当它是唯一的时报告重复),但在其他方面相当便宜。有用吗?您可以将哈希值与数据一起存储在数据库中以允许快速检查 - 但是如果您这样做,则应该为char选择自己的哈希算法(因为它不能保证保持不变) - 也许只是转换例如,对于一个int - 或者重用现有的实现:

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

暂时不说 - 对于8x8,你总是可以用64个字符的字符串来思考,只需检查==即可。这在数据库和应用程序中同样有效。

答案 1 :(得分:1)

你不能让数据库去做吗?使网格列为UNIQUE。然后,如果您需要检测是否已生成重复的网格,则执行此操作的方法可能涉及检查受操作影响的行数,或者可能需要测试错误。

此外,如果从[0,255]中随机选择每个字节,那么执行哈希以获得4字节数字并不比将前四个字节从网格中取出更好。碰撞的可能性是一样的。

答案 2 :(得分:0)

我会使用校验和/哈希机制来捕获大部分匹配项,然后在得到匹配项时进行完整比较。

用于填充网格的字符范围是多少?如果您只使用字母(不是混合大小写,或者大小写不重要)和8x8网格,那么假设良好的散列,您在问题空间中每个项目只会讨论大约7次可能的碰撞(非常罕见)功能。你可以这样做:

  1. 生成网格
  2. 从DB
  3. 加载任何匹配的网格
  4. 如果找到匹配来自#2,转到1
  5. 使用新网格。

答案 3 :(得分:0)

试试这个(为每个矩阵调用ComputeHash并比较guid):

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数组。