我想生成任意C字符串的一个很好的混合整数指纹。大多数C字符串将由ASCII文本字符组成:
一种用法是安全性(但不是加密)相关。我可以向用户询问文本密码,将其转换为整数进行存储,然后测试此整数是否正确。 (我知道我可以存储字符串,但我不想。如果我的程序可以减慢不正确的尝试,使得暴力无法比密码猜测更快地工作,那么正确地猜测32位整数是不可能的。另一种用法function是作为哈希索引函数(mod数组长度)到数组的开始。)
唉,我可能在这里重新发明轮子。这些功能可能已经写了一百万次,而且是那些精通密码学的人。当然,我不需要AES,但更轻巧的东西。用途不同。我的第一个想法是
然后我认为位操作可能是计算机快速但需要更多的源代码。我可以想到其他选择。取每个索引位置i并将其乘以每个字符[或上面的x]的ascii表示,并将其称为y [i]。现在执行以下操作:
计算y之和(或此总和加上运行结果)的自然对数,并假装此结果的前32位[可能不包括前几位],这是真的double,是一个整数表示。我可以将每个bitint(log(y [i]))与正在运行的整数结果进行异或。
做得更便宜。只需添加y,然后在最后使用32位pickoff进行一次对数。或者,通过srand作为种子运行sum-y并抓住兰特。
也可能有其他几种方法可以做到。总而言之,该函数应该将字符串映射到非常不同的整数,代码简短,并且非常快。
任何指针?
答案 0 :(得分:1)
生成字符串的不可逆摘要或散列的常用方法是生成循环冗余校验和(CRC)。
CRC的来源广泛可用,在这种情况下,您应该使用通用的CRC-32,例如以太网使用的CRC-32。不同的CRC工作原理相同,购买使用不同的多项式。不要试图发明你自己的多项式;分布可能不是最佳的。
答案 1 :(得分:1)
您正在寻找的是“哈希”。我知道返回短整数的哈希函数的两个例子是MurmurHash和SipHash。我记得,MurmurHash不是设计成加密哈希,而另一方面,SipHash的设计确实考虑了安全性,如homepage所述。 MurmurHash有两个版本,返回32位和64位输出。 SipHash返回64位输出。