在C#中有一种在实例化新哈希表时定义密钥大小的方法吗?
Hashtable myHash = new Hashtable();
我想使用密钥大小的长值,但我似乎超出了可用的密钥大小,因为我得到负数。我将一些素数相乘,最大返回值为23 * 23 * 23 * 23 * 23 * 23 * 23 * 23 * 23 = 1801152661463。
感谢。
答案 0 :(得分:2)
首先,如果您使用.net 3.5或更高版本,则应使用HashSet<T>
;如果使用.net,则应使用Dictionary<T,bool>
。通用集合提供更好的编译时检查,更少的强制转换和减去拳击。
int溢出最有可能在插入当前代码中的Hashtable
之前发生。所以你观察到的bug很可能与Hashtable
无关,但它是你的算术代码中的一个错误。您可能需要将某些内容投射到long
。但除非您发布相关代码,否则我无法告诉您溢出发生的确切位置。
答案 1 :(得分:0)
.NET Hashtable
和HashSet<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
的实现。