我正在寻找一组函数(哈希函数?不确定),它将一组(唯一)数字映射到另一组(唯一)数字。我看了一下完美的哈希 - 以及这是不可能做到的事实:( - 它似乎与我所追求的非常接近。
详细说明,我想要以下内容:
在我的情况下,像最小散列函数这样的东西不起作用,因为每个数字必须在不同的计算机上计算,这意味着函数本身必须保证这些特征而不检查结果中的冲突和/或具有任何集中控制结果集。
这样一个函数的一个例子就是一个简单的例子: 取数字,加1,输出数字。 唯一的问题是你可以通过减去一个来轻松获得第一个数字。我希望它变得非常困难,或者最好不可能获得之前的数字。
有什么想法吗?
将函数从数学转换为java我不介意自己做。除非你可以建议一个已经存在的java库。
答案 0 :(得分:1)
您正在寻找Format-preserving encription算法。
答案 1 :(得分:0)
对我来说,这看起来是一个加密问题。 如果要将String映射到其他String并且必须能够保证是一种方式且没有冲突,则需要加密输入String。 例如,您可以使用DES。
如果输出必须是数字,则可以将输出的字节解释为十六进制,然后转换为基数10.
答案 2 :(得分:0)
你想要的是一个密码。一个很好的老式对称密码。像AES一样。
想象一下,而不是12位,你的数字是128位长。假设您使用您选择的密钥设置AES密码,并使用它来加密数字。结果是什么?
现在,128位比您想要的更大,因此AES对您来说不是正确的密码。您需要做的就是选择一个12位块大小的密码。
没有任何常规密码具有12位块大小。但实际上很容易构建一个。您可以使用Feistel construction获取哈希函数并构造分组密码。您可以构建一个合适大小的二进制密码(在您的情况下为40位),然后使用“仓促布丁技巧”将其域限制为12位,或构造直接以十进制(或多或少)工作的密码。
前一段时间我写了an answer to another question,更详细地解释了这一点;我甚至写了some code to implement the idea,虽然现在看着它,但我不知道它是多么容易理解。其中的关键类是TinyCipher
,它实现了一个块大小最多为32位的密码(并且可以很容易地扩展到64位),以及TrickCipher
,它使用仓促的布丁技巧在任意大小的集合上实现密码(例如所有12位数字)。