我目前正在C# Collections观看视频,并发现了以下一些引起我兴趣的代码:
int hashKey = (int)((uint)hashCode % capacity);
这与之前的内容有所不同:
int hashKey = Math.Abs(hashCode % capacity);
第一个实现使hashKey的值为 47 ,而第二个实现将其保留为 49 ,前者给出了预期的结果。
我手动添加了字符串" Hello"进入我的哈希表,所以我希望在调用我的函数时检索包含该单词的存储桶,如下所示:
LinkedString results = hash.GetAllAtHash("Hello".GetHashCode());
这是完整性的功能:
public LinkedString GetAllAtHash(int hashCode)
{
int hashKey = (int)((uint)hashCode % capacity);
//int hashKey = Math.Abs(hashCode % capacity);
return values[hashKey];
}
使用单向另一种方式有什么意义吗?为什么他们都返回不同的值,如果我没有观看视频,如果没有编译/运行时错误,我怎么能够告诉错误?
由于
答案 0 :(得分:0)
这完全是因为uint
施法。如果你编写如下代码,你将会得到相同的结果:
int hashKey = (int)((uint)(hashCode % capacity));
我的意思是将hashCode % capacity
放在括号内,然后转换为uint
。如果这样做,您将得到第二个hashKey
的否定结果。
因此,以下hashKey
是相同的:
int hashKey1 = hashCode < 0 ? -(int)((uint)(hashCode % capacity)) : (int)((uint)hashCode % capacity);
int hashKey2 = Math.Abs(hashCode % capacity);
我已经提到,如果没有括号,它首先将hashcode
转换为uint
(不是%
的结果),如果hashCode
为否定,则为无符号意志是另一个必然与hashCode
不同的数字。