2011-04-25 108 views
1

在C#中是否有一种在实例化新哈希表时定义密钥大小的方法?有没有一种方法来定义键值的大小?

Hashtable myHash = new Hashtable(); 

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

谢谢。

回答

2

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

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

+0

你可能是对的,我会回去检查,可能在乘法部分。 – flavour404 2011-04-25 18:13:32

+0

谢谢,你是正确的,我是作为整数值乘以和最大值被超过,然后写入一个长期。我把它们全部转换到乘法线之前,现在它正常工作。我验证了结果,他们确实是正确的。谢谢你的评论真的有帮助。 – flavour404 2011-04-25 18:48:59

0

.NET HashtableHashSet<T>类都调用object.GetHashCode()来检索散列。由于GetHashCode()返回一个int,即所使用的散列键的大小。

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

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

0

由于System.Object方法GetHashCode()返回一个int,我要说的是,你的哈希码算法的选择是仅限于那些返回一个32位值(无论你想称之为符号或无符号不成型差分:散列值只是一个任意的32位值)。

HashTable并不关心你的键或值是什么:就它而言,它们都只是对象。你可能想确保你的重写和实施GetHashCode()Equals()。也可能想考虑一下IComparable的实现。

相关问题