有没有一种方法来定义键值的大小?
在C#中是否有一种在实例化新哈希表时定义密钥大小的方法?有没有一种方法来定义键值的大小?
Hashtable myHash = new Hashtable();
我想为密钥大小使用较长的值,但我似乎超过了可用的密钥大小,因为我得到负数。我一起乘以一些素数,最大的返回值是23 * 23 * 23 * 23 * 23 * 23 * 23 * 23 * 23 = 1801152661463.
谢谢。
首先,如果您使用.net 3.5或更高版本,您应该使用HashSet<T>
,如果您使用.net 2,则应该使用Dictionary<T,bool>
。通用集合提供更好的编译时检查,更少的强制转换和更少的装箱。
int overflow最有可能发生在插入当前代码中的Hashtable
之前。所以你观察到的错误很可能与Hashtable
无关,但它是算术代码中的一个错误。您可能需要投些东西给long
。但除非您发布相关代码,否则我无法告诉您发生溢出的确切位置。
.NET Hashtable
和HashSet<T>
类都调用object.GetHashCode()
来检索散列。由于GetHashCode()
返回一个int
,即所使用的散列键的大小。
如果您想提供自己的散列函数,您可以覆盖要插入的类型中的GetHashCode()
,或者定义自定义的IEqualityComparer<T>
并将其传递给HashSet构造函数。但是,IEqualityComparer<T>.GetHashCode()
方法也返回一个整数键,所以我不确定这将满足您的需求。
如果您的应用程序需要大于int
的散列键,您可能需要创建自己的HashSet数据结构。
由于System.Object
方法GetHashCode()
返回一个int,我要说的是,你的哈希码算法的选择是仅限于那些返回一个32位值(无论你想称之为符号或无符号不成型差分:散列值只是一个任意的32位值)。
HashTable并不关心你的键或值是什么:就它而言,它们都只是对象。你可能想确保你的重写和实施GetHashCode()
和Equals()
。也可能想考虑一下IComparable
的实现。
你可能是对的,我会回去检查,可能在乘法部分。 – flavour404 2011-04-25 18:13:32
谢谢,你是正确的,我是作为整数值乘以和最大值被超过,然后写入一个长期。我把它们全部转换到乘法线之前,现在它正常工作。我验证了结果,他们确实是正确的。谢谢你的评论真的有帮助。 – flavour404 2011-04-25 18:48:59