代码之家  ›  专栏  ›  技术社区  ›  Jeffrey Kern

数组/列表和计算哈希值(VB、C#)

  •  0
  • Jeffrey Kern  · 技术社区  · 14 年前

    现在,如果我有一个列表,其中T是一个本机数据类型。如果我试图计算ListA和ListB的hashvalue,假设它们的大小相同,包含的信息也相同,那么它们的hashvalue不是也一样吗?

    {5,2,0,1,3}

    3 回复  |  直到 14 年前
        1
  •  0
  •   ckramer    14 年前

    如果你说的是内置列表类型,那么不,它们是不相等的。为什么?因为 List<T> Equals GetHashCode 方法来支持此行为,但它不会发生在内置类型上。

        2
  •  2
  •   Donnie    14 年前

    这取决于如何计算哈希值以及如何定义相等性。例如,一个数组的两个不同实例恰好包含相同的值,根据应用程序的不同,这两个实例可能不相等。在这种情况下,可以将每个数组的地址或其他唯一值作为哈希函数的一部分。

    但是,如果您想考虑使包含相同值的不同数组相等,则只使用数组中的值来计算列表哈希。当然,在确定相等性时,您必须考虑排序对您是否重要(从而影响哈希函数)。

        3
  •  1
  •   LukeH    14 年前

    如果项目的顺序很重要,那么可以生成如下的序列哈希代码。

    public static int GetOrderedHashCode<T>(this IEnumerable<T> source)
    {
        unchecked
        {
            int hash = 269;
            foreach (T item in source)
            {
                hash = (hash * 17) + item.GetHashCode;
            }
            return hash;
        }
    }
    

    如果项目的顺序不重要,则可以执行以下操作:

    public static int GetUnorderedHashCode<T>(this IEnumerable<T> source)
    {
        unchecked
        {
            int sum = 907;
            int count = 953;
            foreach (T item in source)
            {
                sum = sum + item.GetHashCode();
                count++
            }
            return 991 * sum * count;
        }
    }