从一组唯一数字到另一组唯一数字的单向函数

时间:2013-10-05 12:00:29

标签: java function math hash

我正在寻找一组函数(哈希函数?不确定),它将一组(唯一)数字映射到另一组(唯一)数字。我看了一下完美的哈希 - 以及这是不可能做到的事实:( - 它似乎与我所追求的非常接近。

详细说明,我想要以下内容:

  • 将任何给定的12位数字映射到另一个数字,12位数或更多(我不关心结果大小,但它必须适合Java长)。
  • 每次必须保证相同的12位数字映射到相同的数字。
  • 必须能够保证不同的12位数始终映射到不同的数字,即结果集中没有冲突。
  • 必须能够保证函数是一种方式,(在我看来无论如何)意味着你无法根据函数的结果计算你开始的数字。

在我的情况下,像最小散列函数这样的东西不起作用,因为每个数字必须在不同的计算机上计算,这意味着函数本身必须保证这些特征而不检查结果中的冲突和/或具有任何集中控制结果集。

这样一个函数的一个例子就是一个简单的例子: 取数字,加1,输出数字。 唯一的问题是你可以通过减去一个来轻松获得第一个数字。我希望它变得非常困难,或者最好不可能获得之前的数字。

有什么想法吗?

将函数从数学转换为java我不介意自己做。除非你可以建议一个已经存在的java库。

3 个答案:

答案 0 :(得分:1)

您正在寻找Format-preserving encription算法。

答案 1 :(得分:0)

对我来说,这看起来是一个加密问题。 如果要将String映射到其他String并且必须能够保证是一种方式且没有冲突,则需要加密输入String。 例如,您可以使用DES。

如果输出必须是数字,则可以将输出的字节解释为十六进制,然后转换为基数10.

答案 2 :(得分:0)

你想要的是一个密码。一个很好的老式对称密码。像AES一样。

想象一下,而不是12位,你的数字是128位长。假设您使用您选择的密钥设置AES密码,并使用它来加密数字。结果是什么?

  • 您将任何给定的128位数字映射到另一个正好为128位的数字(AES的块大小为128位)
  • 您可以保证每次相同的128位数字映射到相同的数字(加密是确定的)
  • 您可以保证两个不同的128位数字始终映射到不同的数字(加密是可逆的 - 没有两个明文加密到相同的密文,否则你怎么能解密它们?)
  • 你可以保证,对于没有密钥的人来说,这个功能是单向的(如果没有密钥,加密是不可逆的 - 如果是这样的话就不那么有用了)

现在,128位比您想要的更大,因此AES对您来说不是正确的密码。您需要做的就是选择一个12位块大小的密码。

没有任何常规密码具有12位块大小。但实际上很容易构建一个。您可以使用Feistel construction获取哈希函数并构造分组密码。您可以构建一个合适大小的二进制密码(在您的情况下为40位),然后使用“仓促布丁技巧”将其域限制为12位,或构造直接以十进制(或多或少)工作的密码。

前一段时间我写了an answer to another question,更详细地解释了这一点;我甚至写了some code to implement the idea,虽然现在看着它,但我不知道它是多么容易理解。其中的关键类是TinyCipher,它实现了一个块大小最多为32位的密码(并且可以很容易地扩展到64位),以及TrickCipher,它使用仓促的布丁技巧在任意大小的集合上实现密码(例如所有12位数字)。