C字符串的轻量级(准随机)整数指纹

时间:2014-08-09 16:08:53

标签: c cryptography

我想生成任意C字符串的一个很好的混合整数指纹。大多数C字符串将由ASCII文本字符组成:

  • 我想要类似字符串的指纹非常不同,特别是“ab”和“ba”这样的字符串
  • 我希望很难从指纹反转回字符串(好吧,我的字符串通常长于32位,这意味着许多字符串将映射到相同的整数),这意味着我想再次类似字符串产生非常不同的代码;
  • 我想在整数结果中有效地使用32位,
  • 我希望功能源很小
  • 我希望功能快。

一种用法是安全性(但不是加密)相关。我可以向用户询问文本密码,将其转换为整数进行存储,然后测试此整数是否正确。 (我知道我可以存储字符串,但我不想。如果我的程序可以减慢不正确的尝试,使得暴力无法比密码猜测更快地工作,那么正确地猜测32位整数是不可能的。另一种用法function是作为哈希索引函数(mod数组长度)到数组的开始。)

唉,我可能在这里重新发明轮子。这些功能可能已经写了一百万次,而且是那些精通密码学的人。当然,我不需要AES,但更轻巧的东西。用途不同。

我的第一个想法是

  • mod 64每个字符都可以利用ASCII文本方面。现在我有6位。叫这个x。
  • 我可以将一个6位字符串放入32位空间中的5个位置,留下2位。
  • 获取当前字符串索引位置(0,1,2 ...),mod5以确定我要将x放入运行的整数结果代码的位置。将我的x转换为此运行结果整数。
  • 使用剩余的2位为处理的每个字符递增计数器[mod 4以防止溢出]。

然后我认为位操作可能是计算机快速但需要更多的源代码。我可以想到其他选择。取每个索引位置i并将其乘以每个字符[或上面的x]的ascii表示,并将其称为y [i]。现在执行以下操作:

  • 计算y之和(或此总和加上运行结果)的自然对数,并假装此结果的前32位[可能不包括前几位],这是真的double,是一个整数表示。我可以将每个bitint(log(y [i]))与正在运行的整数结果进行异或。

  • 做得更便宜。只需添加y,然后在最后使用32位pickoff进行一次对数。或者,通过srand作为种子运行sum-y并抓住兰特。

也可能有其他几种方法可以做到。总而言之,该函数应该将字符串映射到非常不同的整数,代码简短,并且非常快。

任何指针?

2 个答案:

答案 0 :(得分:1)

生成字符串的不可逆摘要或散列的常用方法是生成循环冗余校验和(CRC)。

CRC的来源广泛可用,在这种情况下,您应该使用通用的CRC-32,例如以太网使用的CRC-32。不同的CRC工作原理相同,购买使用不同的多项式。不要试图发明你自己的多项式;分布可能不是最佳的。

答案 1 :(得分:1)

您正在寻找的是“哈希”。我知道返回短整数的哈希函数的两个例子是MurmurHash和SipHash。我记得,MurmurHash不是设计成加密哈希,而另一方面,SipHash的设计确实考虑了安全性,如homepage所述。 MurmurHash有两个版本,返回32位和64位输出。 SipHash返回64位输出。