http://msdn.microsoft.com/en-us/library/system.object.getashcode(VS.80).aspx说:
为了获得最佳性能,散列函数必须为所有输入生成随机分布。
它是否对性能有任何影响,或者可以使用不提供“随机分布”但不会导致更多冲突的函数(如 return this.Id)?
http://msdn.microsoft.com/en-us/library/system.object.getashcode(VS.80).aspx说:
为了获得最佳性能,散列函数必须为所有输入生成随机分布。
它是否对性能有任何影响,或者可以使用不提供“随机分布”但不会导致更多冲突的函数(如 return this.Id)?
return this.Id
通常会很好(特别是如果Id
它是不可变且唯一的) - 主要思想是避免冲突。但是,还要考虑待处理的数据 -Id
您尚未保存的 27 行中的哪一行?
还要注意GetHashCode
和Equals
实现必须一致。
使用 this.Id 通常没问题。基础是您不希望有太多的冲突最终出现在同一个bucket中。桶号通常通过获取哈希码并将其视为“mod x”来获得,其中 x 是哈希表中的桶数,通常是素数(或可能的素数)。
如果您只是使用增加的 ID(1、2、3、4...),就桶分布而言,这最终会变得非常随机。只有当您的 ID 遵循一种模式,该模式很可能为您需要担心的大量条目提供相同的存储桶编号。
似乎措辞不佳......我认为他们的意思是哈希码应该“均匀分布”在所有可能的int
值上(如果我错了,.net 专家请纠正我),这将有助于最大限度地减少冲突。
这是一个例子:假设我所有的哈希码都在 1 到 10 的范围内。如果我要使用哈希码来计算数组长度为 100 的数组索引,那么我最多只能得到 10 个不同的索引。这意味着我的数组利用率很低,我会遇到很多冲突。
它可能对例如产生影响。根据高位散列到桶中的散列表(不常见)。此外,如果您的 id 都可以被 4 整除,那么这可能会使散列到存储桶中的哈希表hash_code%buckets
仅每四个存储桶使用一次。
我更喜欢使用
this.Id.GetHashCode();
我认为这使得哈希更有可能被正确分配,而不是直接使用 Id。