紧急求助:C# windows 窗口的程序,哈希加密的命名空间简历怎么写写。

一,哈希表(Hashtable)简述
在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对.
二,哈希表的简单操作
在哈希表中添加一个key/value键值对:HashtableObject.Add(key,value); 在哈希表中去除某个key/value键值对:HashtableObject.Remove(key); 从哈希表中移除所有元素: HashtableObject.Clear(); 判断哈希表是否包含特定键key: HashtableObject.Contains(key); 下面控制台程序将包含以上所有操作: using S using System.C //使用Hashtable时,必须引入这个命名空间 class hashtable { public static void Main() { Hashtable ht=new Hashtable(); //创建一个Hashtable实例 ht.Add(&E&,&e&);//添加key/value键值对 ht.Add(&A&,&a&); ht.Add(&C&,&c&); ht.Add(&B&,&b&);
string s=(string)ht[&A&]; if(ht.Contains(&E&)) //判断哈希表是否包含特定键,其返回值为true或false Console.WriteLine(&the E key:exist&); ht.Remove(&C&);//移除一个key/value键值对 Console.WriteLine(ht[&A&]);//此处输出a ht.Clear();//移除所有元素 Console.WriteLine(ht[&A&]); //此处将不会有任何输出 } }
三,遍历哈希表
遍历哈希表需要用到DictionaryEntry Object,代码如下: for(DictionaryEntry de in ht) //ht为一个Hashtable实例 { Console.WriteLine(de.Key);//de.Key对应于key/value键值对key Console.WriteLine(de.Value);//de.Key对应于key/value键值对value }
四,对哈希表进行排序
对哈希表进行排序在这里的定义是对key/value键值对中的key按一定规则重新排列,但是实际上这个定义是不能实现的,因为我们无法直接在Hashtable进行对key进行重新排列,如果需要Hashtable提供某种规则的输出,可以采用一种变通的做法: ArrayList akeys=new ArrayList(ht.Keys); //别忘了导入System.Collections akeys.Sort(); //按字母顺序进行排序 for(string skey in akeys) { Console.Write(skey + &:&); Console.WriteLine(ht[skey]);//排序后输出 }
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:18055次
排名:千里之外
原创:14篇
转载:37篇
(1)(1)(1)(3)(1)(5)(7)(3)(20)(7)(2)Object.GetHashCode 方法
此文章由机器翻译。 将光标移到文章的句子上,以查看原文。
Object.GetHashCode 方法
.NET Framework 4.5
作为默认哈希函数。
命名空间:
mscorlib(在 mscorlib.dll 中)
public virtual int GetHashCode()
类型:哈希代码是用于插入的数值并确定在基于哈希的集合的对象 (如
选件类、 选件类或从
选件类派生类型。
GetHashCode
方法为需要对象相等快速检查的算法提供此哈希代码。
说明有关哈希码如何用于哈希表以及一些其他的哈希代码算法的信息,请参见在 Wikipedia
中的项。相等的两个对象返回相同的哈希码。
但是,如果反转不为真:相等哈希码不表示对象相等,因为不同的 (不相等) 对象可能具有相同的哈希码。
此外,.NET Framework 不保证 GetHashCode 方法的默认实现,并且此方法返回的值于 .NET Framework 版本和平台之间可能不同,如 32 位和 64 位平台。
因此,在进行哈希运算时,该方法的默认实现不得用作唯一对象标识符。
两种结果,如下:
您不应该假定,相等哈希代码表示对象相等。警告
对于加密哈希,请使用来自
类的派生类。
GetHashCode
方法可以由派生类型重写。
如果 GetHashCode 没有重写,引用类型的哈希代码通过调用基类的 ObjectGetHashCode 方法计算,它基于对象的引用的哈希代码计算;有关更多信息,请参见 。
换言之, 方法返回 true 的两个对象具有相同的哈希代码。
方法使用反射计算基于类型字段的值的哈希代码。
换言之,字段有相同值的值类型有相等的哈希代码。
有关重写的 GetHashCode的详细信息,请参见"Notes to Inheritors"一节。
警告 方法,还应重写 ,反之亦然。
方法返回 true,重写的 GetHashCode 方法必须返回两个对象的相同值。
如果在哈希表中的作为键使用的对象不提供一个有用的 GetHashCode的实现,可以通过提供
实现对 类构造函数之一的重载指定哈希代码提供程序。 方法时,它会针对不重写 GetHashCode的类提供默认值行为。
这是由 .NET Framework 为 Windows 运行时 提供的支持的一部分 (请参见)。
,当前不执行 GetHashCode。
、和 GetHashCode 方法,当您在 C# 或 Visual Basic 代码时,.NET Framework,并为这些方法提供默认值行为。
在 C# 或 Visual Basic 编写的Windows 运行时 类可以重写方法 GetHashCode。对继承者的说明哈希函数用于快速生成一个与对象的值相对应的数字(哈希代码)。
哈希函数通常是特定于每个类型的,而且,必须只能使用一个实例字段作为输入。
不应计算使用静态字段的值的哈希代码。
派生的类,只有当派生类定义相等性为引用相等性,GetHashCode 方法可以委托到基类 ObjectGetHashCode 实现。
GetHashCode
对引用类型的默认值实现返回等效于
方法返回的哈希代码。
通常,对于可变引用类型,则应该重写 GetHashCode,只有当:
可以从不可变字段的哈希代码计算;或可以确保可变对象的哈希代码不更改,而集合中包含的对象依赖其哈希代码。否则,您可能认为变量的对象在哈希表中丢失。
,文档应明确指出您的类型的使用者不应修改对象值,该对象在哈希表中存储。
GetHashCode 提供使用反射的默认哈希代码实现。
更好的性能,应考虑重写它。
说明有关以各种方式计算哈希代码的更多信息和示例,请参见的"示例"部分。哈希函数必须具有以下特点:如果两个对象的比较结果相等,则每个对象的 GetHashCode 方法都必须返回同一个值。
但是,如果两个对象的比较结果不相等,则这两个对象的 GetHashCode 方法不一定返回不同的值。
一个对象的 GetHashCode 方法必须总是返回同一个哈希代码,但前提是没有修改过对象状态,对象状态用来确定对象的
方法的返回值。
请注意,这仅适用于应用程序的当前执行,再次运行该应用程序时可能会返回另一个哈希代码。
为了获得最佳性能,哈希函数应生成所有输入的一个均匀分布,包括大量群集的输入。
问题是对象状态的小修改会导致大修改,以获得最佳的哈希表的性能所产生的哈希码。
哈希函数的计算成本必须不高。
GetHashCode
方法不应引发异常。例如, 类提供的
方法的实现为相同的字符串值返回相同的哈希代码。
因此,如果两个
对象表示相同的字符串值,则它们返回相同的哈希代码。
另外,该方法使用字符串中的所有字符生成相当随机的分布式输出,即使当输入集中在某些范围内时(例如,许多用户可能有只包含低位 128 个 ASCII 字符的字符串,即使字符串可以包含 65,535 个 Unicode 字符中的任何字符)。
在类上提供好的哈希函数可以显著影响将这些对象添加到哈希表的性能。
在具有好的哈希函数实现的带键值哈希表中,搜索元素所用的时间是固定的(例如运算复杂度为 O(1) 的运算)。
而在具有不好的哈希函数实现的哈希表中,搜索性能取决于哈希表中的项数(例如运算复杂度为 O(n) 的运算,其中的 n 是哈希表中的项数)。
恶意用户输入数据增加冲突数,可以显着降低依赖于哈希表的应用程序性能,例如:
当哈希函数生成常见的冲突。当哈希表的一个大比例对象生成相互等于或大致相等的哈希代码。当用户输入哈希代码计算的数据。重写 GetHashCode 的派生类还必须重写 ,以保证被视为相等的两个对象具有相同的哈希代码;否则, 类型可能无法正常工作。其中一种简单计算具有相同的或比
类型较小范围的数值的哈希代码方法是返回该值。
下面的示例演示了 Number 结构的实现。
public struct Number
private int
public Number(int value)
public int Value
get { return }
public override bool Equals(Object obj)
if (obj == null || ! (obj is Number))
return false;
return n == ((Number) obj).n;
public override int GetHashCode()
public override string ToString()
return n.ToString();
public class Example
public static void Main()
Random rnd = new Random();
for (int ctr = 0; ctr &= 9; ctr++) {
int randomN = rnd.Next(Int32.MinValue, Int32.MaxValue);
Number n = new Number(randomN);
Console.WriteLine("n = {0,12}, hash code = {1,12}", n, n.GetHashCode());
// The example displays output like the following:
-, hash code =
, hash code =
-, hash code =
, hash code =
, hash code =
-, hash code =
-, hash code =
-, hash code =
-, hash code =
, hash code =
一个类型常具有多个可以参与生成哈希代码的数据字段。
生成哈希代码的一种方法是使用 XOR (eXclusive OR) 运算合并这些字段,如下面的代码示例所示。
// A type that represents a 2-D point.
public struct Point
private int
private int
public Point(int x, int y)
public override bool Equals(Object obj)
if (! (obj is Point)) return false;
Point p = (Point)
return x == p.x & y == p.y;
public override int GetHashCode()
return x ^
public class Example
public static void Main()
Point pt = new Point(5, 8);
Console.WriteLine(pt.GetHashCode());
pt = new Point(8, 5);
Console.WriteLine(pt.GetHashCode());
// The example displays the following output:
前面的示例返回 (n1,N2) 和 (N2,n1)相同的哈希代码,并且,因此可能生成多于预期的冲突。
许多解决方案可用,以使哈希代码在这些情况下不相同。
一个是返回反映每个字段排序的 Tuple 对象的哈希代码。
下面的示例演示
类的可能实现的实现。
不过,请注意,性能开销实例化 Tuple 对象可能会显着影响在哈希表存储大量的对象应用程序的整体性能。
public struct Point
private int
private int
public Point(int x, int y)
public override bool Equals(Object obj)
if (!(obj is Point)) return false;
Point p = (Point)
return x == p.x & y == p.y;
public override int GetHashCode()
return Tuple.Create(x, y).GetHashCode();
public class Example
public static void Main()
Point pt = new Point(5, 8);
Console.WriteLine(pt.GetHashCode());
pt = new Point(8, 5);
Console.WriteLine(pt.GetHashCode());
// The example displays the following output:
第二种替代方案涉及通过左移两位或更多位的连续字段的哈希代码来加权各个哈希代码。
最好地,超过31位的位移应该包装,而不是被丢弃。
因为在 c# 和 Visual Basic 的左移运算符中位被丢弃,这需要创建类似以下内容的shift-and-wrap方法:
public int ShiftAndWrap(int value, int positions)
positions = positions & 0x1F;
// Save the existing bit pattern, but interpret it as an unsigned integer.
uint number = BitConverter.ToUInt32(BitConverter.GetBytes(value), 0);
// Preserve the bits to be discarded.
uint wrapped = number && (32 - positions);
// Shift and wrap the discarded bits.
return BitConverter.ToInt32(BitConverter.GetBytes((number && positions) | wrapped), 0);
下面的示例使用此 shift-and-wrap 方法计算上一示例中使用的 Point 结构的哈希代码。
public struct Point
private int
private int
public Point(int x, int y)
public override bool Equals(Object obj)
if (!(obj is Point)) return false;
Point p = (Point)
return x == p.x & y == p.y;
public override int GetHashCode()
return ShiftAndWrap(x.GetHashCode(), 2) ^ y.GetHashCode();
private int ShiftAndWrap(int value, int positions)
positions = positions & 0x1F;
// Save the existing bit pattern, but interpret it as an unsigned integer.
uint number = BitConverter.ToUInt32(BitConverter.GetBytes(value), 0);
// Preserve the bits to be discarded.
uint wrapped = number && (32 - positions);
// Shift and wrap the discarded bits.
return BitConverter.ToInt32(BitConverter.GetBytes((number && positions) | wrapped), 0);
public class Example
public static void Main()
Point pt = new Point(5, 8);
Console.WriteLine(pt.GetHashCode());
pt = new Point(8, 5);
Console.WriteLine(pt.GetHashCode());
// The example displays the following output:
受以下版本支持:4.5.2、4.5.1、4.5、4、3.5、3.0、2.0、1.1、1.0受以下版本支持:4、3.5 SP1受以下版本支持:可移植类库受以下版本支持:Windows 8受以下版本支持:Windows Phone 8、Silverlight 8.1Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(不支持服务器核心角色), Windows Server 2008 R2(支持带 SP1 或更高版本的服务器核心角色;不支持 Itanium)
.NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参阅。
本文是否对您有所帮助?
需要更多代码示例
翻译需要改进
(1500 个剩余字符)
感谢您的反馈
页面加载速度够快吗?
您喜欢网页的设计吗?
请告诉我们更多意见}

我要回帖

更多关于 羽绒服工艺单怎么写 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信