如何将 ulong 转换为正整数?

How can I convert a ulong to an positive int?

我有一段代码是

// Bernstein hash
// http://www.eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx           
ulong result = (ulong)s[0];
for ( int i = 1; i < s.Length; ++i ) 
{ 
    result = 33 * result + (ulong)s[i]; 
}
return (int)result % Buckets.Count; 

问题是它有时会返回负值。我知道原因是因为 (int)result 可以是负数。但我想将它强制为非负数,因为它被用作索引。现在我意识到我可以做到

int k = (int)result % Buckets.Count; 
k = k < 0 ? k*-1 : k;
return k; 

但是有更好的方法吗?

在更深层次上,为什么int用于C#中容器的索引?我来自 C++ 背景,我们有 size_t 这是一个无符号整数类型。这对我来说更有意义。

使用

return (int)(result % (ulong)Buckets.Count);

当您对值求和时,您得到一个正整数,该整数不能表示为带符号的 32 位整数中的正数。转换为 int 将 return 为负数。然后模运算也会 return 一个负数。如果您先进行模运算,您将得到一个较低的正数并且转换为 int 不会有任何坏处。

虽然您可以找到一种方法将其正确转换为 int,但我想知道您为什么不从一开始就将其计算为 int

int result = (int)s[0]; // or, if s[0] is already an int, omit the cast
for ( int i = 1; i < s.Length; ++i ) 
{ 
    result = 33 * result + (int)s[i]; 
}
return Math.Abs(result) % Buckets.Count;

至于为什么 C# 使用带符号的 int 作为索引,它 has to do with cross-language compatibility.