在下面的GetHashCode
的实现中,当Collection
为null
或为空时,都将导致哈希代码为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;
}
}
答案 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值的可能性不大,那么实际上就不必担心它们发生冲突了。