我需要以确定性的方式将字符串分组为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个字符是防止溢出的最佳方法?
@zaph哈希并不需要使用密码安全。 SHA256是更好的做法,但这些目的我只需要快速和一致的东西。我也没有将mod 10应用于字符串。我首先转换为int。这个想法是我想把未知格式的字符串分成10个桶。所以hash() - > int - > mod10将为我做这个 – sedavidw
我在2.3 GHz Intel Core i7笔记本电脑上定时MD5和SHA256,进行1,000次迭代。时间是:MD5Hash:622纳秒/散列,SHA256Hash:703纳秒/散列。所以MD5的速度提高了13%,而且这两次都是微不足道的。我还发现iPhone6上的SHA256比Intel笔记本上的快4倍。关键是真的需要有一个令人信服的理由来使用过时的方法。第二点是不要搞过早的优化。 – zaph
@zaph由于安全原因,这些方法已过时...这不是问题 – sedavidw