2016-03-03 37 views
2

我需要以确定性的方式将字符串分组为10个不同的组,并且具有一定的一致性。这些字符串是来自不同来源的标识符,全部使用不同的(基本未知的)格式。哈希和模数字符串在C#和Python之间具有相同的结果

为了达到这个目的,我决定将字符串和模块散列为10.但是我将在两个不同的位置做这个,我需要它们的结果是一致的,一个是C#应用程序,另一个是python一。

为了确保一致的散列,我决定使用MD5(合理快速且一致)。 Python已经在hashlib库和C#有一个在Cryptography

然而,我需要int和模数这些数字的一致性。在蟒蛇这很容易

md5 = hashlib.md5() 
md5.update(my_string) 
int(md5.hexdigest(), 16) % 10 

但我不能这样做在C#中,因为我只有64位整数。所以我的想法是只抓住十六进制中的最后16个字符。在C#中蟒蛇

int(md5.hexdigest()[-16:]) % 10 

然后

// hashString filled via MD5 code in the C# link above 
string subHash = hashString.Substring(hashString.Length - 16); 
Convert.ToUInt64(subHash, 16) % 10; 

现在我的问题是这些。这两种方法是否等同? MD5是不错的选择吗?这当然是一致的,但如果有更快的东西会是理想的。抓住最后16个字符是防止溢出的最佳方法?

+0

@zaph哈希并不需要使用密码安全。 SHA256是更好的做法,但这些目的我只需要快速和一致的东西。我也没有将mod 10应用于字符串。我首先转换为int。这个想法是我想把未知格式的字符串分成10个桶。所以hash() - > int - > mod10将为我做这个 – sedavidw

+0

我在2.3 GHz Intel Core i7笔记本电脑上定时MD5和SHA256,进行1,000次迭代。时间是:MD5Hash:622纳秒/散列,SHA256Hash:703纳秒/散列。所以MD5的速度提高了13%,而且这两次都是微不足道的。我还发现iPhone6上的SHA256比Intel笔记本上的快4倍。关键是真的需要有一个令人信服的理由来使用过时的方法。第二点是不要搞过早的优化。 – zaph

+0

@zaph由于安全原因,这些方法已过时...这不是问题 – sedavidw

回答

0

这个问题的答案Where can I find source or algorithm of Python's hash() function?包含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; 
} 
相关问题