我需要将此代码反向工程为C#,并且输出绝对相同至关重要。关于ord函数和“strHash%(1<< 64)”部分的任何建议?
def easyHash(s):
"""
MDSD used the following hash algorithm to cal a first part of partition key
"""
strHash = 0
multiplier = 37
for c in s:
strHash = strHash * multiplier + ord(c)
#Only keep the last 64bit, since the mod base is 100
strHash = strHash % (1<<64)
return strHash % 100 #Assume eventVolume is Large
答案 0 :(得分:4)
可能是这样的:
请注意,我使用ulong
代替long
,因为我不希望在溢出后有负数(他们会搞乱计算)。我不需要执行strHash = strHash % (1<<64)
因为ulong
是隐含的。
public static int EasyHash(string s)
{
ulong strHash = 0;
const int multiplier = 37;
for (int i = 0; i < s.Length; i++)
{
unchecked
{
strHash = (strHash * multiplier) + s[i];
}
}
return (int)(strHash % 100);
}
unchecked
关键字通常不是必需的,因为&#34;通常&#34; C#以unchecked
模式编译(因此不检查溢出),但代码可以在checked
模式下编译(有一个选项)。编写的代码需要unchecked
模式(因为它可能有溢出),因此我强制使用unchecked
关键字。
Python:https://ideone.com/RtNsh7