在读.net 源码时读到这个,
在 Rectangle 类的一个方法!
//不懂什么 意思!
//好象是在对距形的数据压缩
public override int GetHashCode()
{
return (((this.X ^ ((this.Y << 13) | (this.Y >> 0x13))) ^ ((this.Width << 0x1a) | (this.Width >> 6))) ^ ((this.Height << 7) | (this.Height >> 0x19)));
}
求高手解译,
这什么 有什么 用?.net
在 Rectangle 类的一个方法!
//不懂什么 意思!
//好象是在对距形的数据压缩
public override int GetHashCode()
{
return (((this.X ^ ((this.Y << 13) | (this.Y >> 0x13))) ^ ((this.Width << 0x1a) | (this.Width >> 6))) ^ ((this.Height << 7) | (this.Height >> 0x19)));
}
求高手解译,
这什么 有什么 用?.net
解决方案 »
- winform 读取execl
- C#读取串口线程,关闭时出现错误~~~急
- 高手请教 数据库操作 修改 乱码问题 急急急急急急急急急急急急急急!!!!!
- 默认情况下创建的线程是不是 后台线程??也就是说主窗口一关闭,其它线程就全部消失了
- 求救! 怎样把textBox内容与数据库数据比较?
- 如何知道datagrid 的CurrentCell 之前的ColumnNumber RowNumber 的值
- 如何通过客户端程序(winform程序)将internet服务器上的文件夹中的图片下载到本地?
- 急求:如何给treeview的结点node加上单击click事件?treeview从数据库中动态生成
- 如何禁止同一窗体重复出现
- 抓取HTML代码速度好慢啊~怎么处理?
- 如何设置由mdi子窗体弹出的窗体成为mdi父窗体的子窗体
- LINQ的问题
用作特定类型的哈希函数。GetHashCode 适合在哈希算法和数据结构(如哈希表)中使用。
?
从感觉,
一样大小的距形的 GetHashCode 返回相同的数据,
可是,不相等的距形的 GetHashCode 也可能返回相同的数据。所以不知他意义何在。
你的直观感觉是对的。Hash算法用来产生对应数据的摘要,这个摘要可以用来进行粗略比较、索引、查找、分组、抽样、校验等很多用途。相同(相同的概念由数据结构设计者决定)的数据一定拥有相同的hash值,不同的数据可以有相同或者不同的hash。hash算法的选取尽量满足如下目标:(1)均匀的分布。随机的数据,产生的hash不应该集中在很小的数值范围内;(2)雪崩效应,改变数据,得到的hash应该有很大的不同;(3)很小的碰撞概率,也就是随机2个不同数据的hash相等的概率要低;(4)很高的效率,hash算法本身要高效。为什么要这4个目标,从我前面说的用途不难理解。
----如下使用
1·如下声明一个数据类型 的变量
Dictionary<int,list<object>> saveData 用GetHashCode方向取得的数据 做dictionary 的key 键,
当有很多 Rectangle 类型 的数据要存储的时候,就往saveData 变量里面 push就上面的方法,他的效率我还是有一点疑问,
他与下面一种方法比较起来哪一个快?
2·直接用List<Rectangle> 变量来存放。
来的数据本身就是这种Dictionary<Rectangle ,object> saveData
用Rectangle key 就不如用int 做key 的效率高
所以要把Rectangle 对象(有损地压缩成int 类型)
那么,这样就成了一对多的关系了!这时就可以用下面的类型来代替上面的类型、//注意,saveData的key 由 Rectangle对象的GetHashCode()方法取得
Dictionary<int,object[]> saveData
大侠是这个意思么?
但是Dictionary在内部处理Hash碰撞。
上面的应该不是这样的吧! 实际应用,是先进行 对象的 GetHashCode
判断,GetHashCode 方法很快, 而且返回是int 类型 ,只有32位。
比较很快。
做HashCode 第一次过滤!当 HashCode 过滤没效时,才有必要进行[全判断]即Ojbect 的IsEqual 方法所以用法应该是://比较objectA =? objectB bool isEqual = false;
if(objectA.HashCode()==objectB.HashCode())////这个比较耗时快
{
isEqual = (objectA.HashCode()==objectB.HashCode());//这个比较耗时
}//
而Object.ReferenceEquals() 才是比较内存地址!
//比较objectA =? objectB
bool isEqual = false;
if(objectA.HashCode()==objectB.HashCode())////这个比较耗时快
{
isEqual = object.Equals(objectA,objectB);//这个比较耗时
}