哈希和模数字符串,在 C# 和 Python 之间具有等效的结果
本文关键字:结果 之间 数字 字符串 哈希 Python | 更新日期: 2023-09-27 18:37:13
我需要以确定性的方式将字符串分组为十个不同的组,并具有一定程度的一致性。 字符串是来自不同来源的标识符,所有标识符都具有不同的(基本上未知的)格式。
为了完成这一点,我决定将字符串和 mod 散列 10。 但是,我将在两个不同的位置执行此操作,我需要它们的结果保持一致,一个是 C# 应用程序,另一个是 python 应用程序。
为了确保一致的哈希,我决定使用 MD5(相当快和一致)。 Python 在 hashlib 库中已经有这个,C# 在密码学中有一个
但是,我需要一致地对这些数字进行整数和取模。 在python中,这很容易
md5 = hashlib.md5()
md5.update(my_string)
int(md5.hexdigest(), 16) % 10
但我不能只在 C# 中执行此操作,因为我只有 64 位整数。 所以我的想法是从十六进制中抓取最后 16 个字符。 在蟒蛇中
int(md5.hexdigest()[-16:]) % 10
然后在 C# 中
// hashString filled via MD5 code in the C# link above
string subHash = hashString.Substring(hashString.Length - 16);
Convert.ToUInt64(subHash, 16) % 10;
现在我的问题是这些。 这两种方法是否保证等效? MD5 在这里是一个不错的选择吗? 它当然是一致的,但如果有更快的东西,那将是理想的。 抓取最后 16 个字符是防止溢出的最佳方法吗?
这个问题的答案 我在哪里可以找到 Python hash() 函数的源代码或算法? 包括 Python 哈希函数的源代码(C 语言)。 你不能在 C# 中实现它吗? 我猜它会比MD5快得多。
字符串的 Python 哈希函数:
static long string_hash(PyStringObject *a)
{
register Py_ssize_t len;
register unsigned char *p;
register long x;
if (a->ob_shash != -1)
return a->ob_shash;
len = Py_SIZE(a);
p = (unsigned char *) a->ob_sval;
x = *p << 7;
while (--len >= 0)
x = (1000003*x) ^ *p++;
x ^= Py_SIZE(a);
if (x == -1)
x = -2;
a->ob_shash = x;
return x;
}