GetHashCode中的空集合与空集合

时间:2019-06-12 07:50:53

标签: c# .net hash .net-core gethashcode

在下面的GetHashCode的实现中,当Collectionnull或为空时,都将导致哈希代码为0

同事建议返回一个随机的硬编码数字,例如19,以区别于null集合。我为什么要这样做?我为什么要关心null或空集合会产生不同的哈希码?

public class Foo
{
    public List<int> Collection { get; set; }
    // Other properties omitted.

    public int override GetHashCode()
    {
        var hashCode = 0;
        if (this.Collection != null)
        {
            foreach (var item in this.Collection)
            {
                var itemHashCode = item == null ? 0 : item.GetHashCode();
                hashCode = ((hashCode << 5) + hashCode) ^ itemHashCode;
            }
        }

        return hashCode;
    }
}

1 个答案:

答案 0 :(得分:2)

const http = require('http'); const CacheableRequest = require('cacheable-request'); let withCacheHTTPRequestWrapper = function() { let originalCallback = arguments[arguments.length-1]; let parameters = []; for (let i=0; i<arguments.length-1; i++) { parameters.push(arguments[i]); } let stripCacheHeaderCallback = function(res) { delete res.headers['cache-control']; // need to remove cache-control from res.rawHeaders too originalCallback(res); }; parameters.push(stripCacheHeaderCallback); return http.request.apply(this, parameters); }; // Example below let req = withCacheHTTPRequestWrapper('http://example.com', function(response){ // no "cache-control" in response now. }); req.end(); // Wrap with cacheable-request const cacheableRequest = new CacheableRequest(withCacheHTTPRequestWrapper); 的设计在于,它应尽可能最大程度地减少发生冲突的次数。虽然不可避免发生 some 哈希冲突,但您需要注意哪些类型的对象发生冲突,哪些类型的数据将存储在基于哈希的集合中,并努力确保存储在同一集合中的对象类型发生碰撞的可能性较小。

因此,如果您碰巧知道如何使用这种基于散列的集合,并且其中可能同时存在null和空对象,那么不使用它们就可以提高性能。碰撞。如果您怀疑在同一个集合中同时存在null和empty值的可能性不大,那么实际上就不必担心它们发生冲突了。