旗下导航:搜·么
当前位置:网站首页 > .Net教程 > 正文

C# GetHashCode 的完成体式格局【C#.Net教程】,C#,GetHashCode

作者:搜教程发布时间:2019-11-27分类:.Net教程浏览:74评论:0


导读:在项目中,在运用哈希表时,有时会须要OverrideGetHashCode。这里给出一种广泛的做法:版本1:完成一个helper,通报范例T,返回这个范例的hashcode。函数...
在项目中,在运用哈希表时,有时会须要Override GetHashCode。这里给出一种广泛的做法:

版本1:
完成一个helper,通报范例T,返回这个范例的hashcode。函数逻辑很直接,只是做了null check罢了;假如obj不为空,则直接运用obj的hash code。

public class HashHelper
{
	private int _seed = 17;	
	public int Hash<T>(T obj)
	{
		// why 31?
		// http://www.ki4.cn/
		// shortly, to reduce the conflict of hashing key's distrabution
		return 31 * _seed + ((obj == null) ? -1 : obj.GetHashCode());
	}
}


为何运用了magic number 31? 运用素数乘积能够相对增添唯一性,削减哈希键值分派时的争执;而31则是为了编译器优化的斟酌(有用的转换为i<<5-1)。也许搜了一下,这类完成体式格局来自JAVA中string 的hash code函数。这里有细致引见:
https://computinglife.wordpress.com/2008/11/20/why-do-hash-functions-use-prime-numbers/
完成版本2:
能够扩大这个类成为流通接口,它能够hash各种范例的,关于值范例来讲,重载的意义在于削减装箱;关于鸠合或泛型,则为了让外部挪用更天然,可读性更强。

public class HashFluent
{
	private int _seed = 17;	
	private int _hashContext;
	
	public HashFluent Hash<T>(T obj)
	{
		// why 31?
		// http://www.ki4.cn/
		// shortly, to reduce the conflict of hashing key's distrabution
		_hashContext = 31 * _seed + ((obj == null) ? -1 : obj.GetHashCode());
		return this;
	}
	
	public HashFluent Hash(int? value)
	{
		_hashContext = 31 * _seed + ((value == null) ? -1 : value.GetHashCode());
		return this;
	}
	
	public HashFluent Hash(IEnumerable sequence)
	{
		if (sequence == null)
		{
			_hashContext = 31 * _hashContext + -1;
		}
		else
		{
			foreach (var element in sequence)
			{
				_hashContext = 31 * _hashContext + ((element == null) ? -1 : element.GetHashCode());
			}
		}
		return this;
	}
	
	public override int GetHashCode (){
		return _hashContext;
	}
		
	// add more overridings here ..
	// add value types overridings to avoid boxing which is important
}

以上就是C# GetHashCode 的完成体式格局的内容,更多相关内容请关注ki4网(www.ki4.cn)!

标签:C#GetHashCode


欢迎 发表评论: