C# 如何将哈希代码转换为索引?

C# 如何将哈希代码转换为索引?,c#,algorithm,C#,Algorithm,要使用GetHashCode()结果作为索引,我们必须将GetHashCode()转换为有效索引。模数不起作用,因为GetHashCode()可能为负值。取绝对值,则模数也不起作用,因为Math.Abs(int.MinValue)抛出异常 在取模之前,我们使用hashCode&0x7FFFFFFF 我不理解这种转变。这是如何工作的?取负数的模有什么问题?Math.Abs(int.MinValue)不工作,因为它是2147483648,不适合int。这是唯一的例外情况:)0x7FFFFFFF=01

要使用
GetHashCode()
结果作为索引,我们必须将
GetHashCode()
转换为有效索引。模数不起作用,因为
GetHashCode()
可能为负值。取绝对值,则模数也不起作用,因为
Math.Abs(int.MinValue)
抛出异常

在取模之前,我们使用
hashCode&0x7FFFFFFF


我不理解这种转变。这是如何工作的?

取负数的模有什么问题?
Math.Abs(int.MinValue)
不工作,因为它是2147483648,不适合
int
。这是唯一的例外情况:)
0x7FFFFFFF
=
0111111111111111111111111111111111111
。因此,按位计算,使用该值只需删除符号位。我认为这样做的方法是使用
未选中的
关键字将
int
转换为
uint
。如
未选中((uint)-1)=4294967295
。如果哈希表大小始终是二的幂,则根本不需要使用模运算,只需使用
哈希和(size-1)
。取负数的模有什么问题?
Math.Abs(int.MinValue)
不起作用,因为它是2147483648,不适用于
int
。这是唯一的例外情况:)
0x7FFFFFFF
=
0111111111111111111111111111111111111
。因此,按位计算,使用该值只需删除符号位。我认为这样做的方法是使用
未选中的
关键字将
int
转换为
uint
。如
未选中((uint)-1)=4294967295
。如果哈希表大小始终是二的幂,则根本不需要使用模运算,只需使用
哈希和(size-1)