有没有办法定义键值的大小?

时间:2011-04-25 18:04:35

标签: c# hashtable

在C#中有一种在实例化新哈希表时定义密钥大小的方法吗?

Hashtable myHash = new Hashtable();

我想使用密钥大小的长值,但我似乎超出了可用的密钥大小,因为我得到负数。我将一些素数相乘,最大返回值为23 * 23 * 23 * 23 * 23 * 23 * 23 * 23 * 23 = 1801152661463。

感谢。

3 个答案:

答案 0 :(得分:2)

首先,如果您使用.net 3.5或更高版本,则应使用HashSet<T>;如果使用.net,则应使用Dictionary<T,bool>。通用集合提供更好的编译时检查,更少的强制转换和减去拳击。

int溢出最有可能在插入当前代码中的Hashtable之前发生。所以你观察到的bug很可能与Hashtable无关,但它是你的算术代码中的一个错误。您可能需要将某些内容投射到long。但除非您发布相关代码,否则我无法告诉您溢出发生的确切位置。

答案 1 :(得分:0)

.NET HashtableHashSet<T>类都调用object.GetHashCode()来检索哈希值。由于GetHashCode()返回int,因此就是使用的哈希键的大小。

如果您想提供自己的哈希函数,可以覆盖要插入的类型中的GetHashCode(),或者定义自定义IEqualityComparer<T>并将其传递给HashSet构造函数。但是,IEqualityComparer<T>.GetHashCode()方法也会返回一个整数键,因此我不确定这是否符合您的需求。

如果您的应用程序需要大于int的哈希键,则可能需要创建自己的HashSet数据结构。

答案 2 :(得分:0)

由于System.Object方法GetHashCode()返回一个int,我会说你选择的哈希码算法仅限于返回32位值的那些(无论你是想将它称为有符号还是无符号)不会产生差异:哈希值只是一个任意的32位值。)

HashTable并不关心你的键或值是什么:就目前而言,它们都只是对象。您可能希望确保正确覆盖并实施GetHashCode()Equals()。可能也想考虑一下IComparable的实现。