校验和变量集合的最佳方法是什么?

时间:2015-02-02 13:06:55

标签: c#

我有一个具有9个属性的对象:整数,字符串,小数,guid。

我有一个这个对象的数组,长度为200万条记录。

我想创建一个字符串哈希/校验和,该对象的属性不会与任何其他记录发生冲突。

在C#中执行此操作的最佳方法是什么?我想到了concat和md5,但是如果我有一个= 1 b = 12或者a = 11 b = 2,那么concat可能会产生碰撞,它们都会连续到112.

编辑:也许CHECKSUM是一个更好的词?我只需要进行快速比较,但不需要直接对象比较,我必须对每个字段进行值比较。

1 个答案:

答案 0 :(得分:1)

  

我必须对每个字段进行值比较

如果这是你的最终需要,没有计算值可以避免比较单个字段,除非该计算值对于任何字段值组合都是唯一的,例如(作为示例)获得的字符串连接所有字段的值每个对象,但请记住,将某些值转换为字符串会导致近似,从而导致对象之间的错误不匹配(尤其是浮点数)。

字段比较是最准确的,但哈希/校验和计算不是为了准确比较,而是仅用于索引,或作为初步检查以避免更密集的计算(如你的)或其他目标不需要按字段填写。

您最终可以编写一个readonly属性,仅在需要时计算一次值,并将其存储为隐藏字段,如:

    public class _Object
    {
        public Int32 IntField;
        public String StringField;
        public Decimal DecimalField;
        public Guid GuidField;

        private string m_UniqueKey;
        [DebuggerBrowsable(DebuggerBrowsableState.Never)]
        public string UniqueKey
        {
            get
            {
                if (m_UniqueKey == null)
                {
                    m_UniqueKey = IntField.ToString()
                                + "|" + (StringField ?? string.Empty)
                                + "|" + DecimalField.ToString("F6", CultureInfo.InvariantCulture)
                                + "|" + GuidField.ToString("X");
                }
                return m_UniqueKey;
            }
        }
    }

上面的代码示例仅计算m_UniqueKey一次(如果它为null)并使用任意字符作为字段值之间的分隔符。它还尝试将十进制值格式化为arbtrary选择的精度。

如果您需要哈希/校验和值,您可以尝试实现GetHashCode()并依赖它,但在这种情况下,您应该包括所有重要字段或部分字段。

的问候,
丹尼尔。