哈希和模数字符串,在 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 个字符是防止溢出的最佳方法吗?

哈希和模数字符串,在 C# 和 Python 之间具有等效的结果

这个问题的答案 我在哪里可以找到 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;
}