4

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

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

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

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

这种函数的一个例子很简单:取数字,加 1,输出数字。唯一的问题是,您只需减去一个即可轻松获得第一个数字。我希望它非常困难,或者最好是不可能找回以前的号码。

有什么想法吗 ?

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

4

3 回答 3

1

您正在寻找保留格式的加密算法。

于 2013-10-05T15:29:42.613 回答
0

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

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

于 2013-10-05T12:59:36.057 回答
0

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

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

  • 您将任何给定的 128 位数字映射到另一个数字,正好是 128 位(AES 的块大小为 128 位)
  • 您可以保证每次相同的 128 位数字映射到相同的数字(加密是确定性的)
  • 您可以保证两个不同的 128 位数字始终映射到不同的数字(加密是可逆的 - 没有两个明文可以加密为相同的密文,否则您如何解密它们?)
  • 您可以保证,对于没有密钥的人,该功能是一种方式(如果没有密钥,加密是不可逆的 - 如果是这样,它的用处就会降低)

现在,128 位比您想要的要大,因此 AES 不适合您。您需要做的就是选择一个具有 12 位块大小的密码。

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

不久前我写了一个对另一个问题的答案,其中更详细地解释了这一点;我什至写了一些代码来实现这个想法,虽然现在看,我不知道它有多容易理解。其中的关键类是TinyCipher,它实现了一个块大小高达 32 位(并且可以轻松扩展到 64 位)的密码,以及TrickCipher,它使用仓促布丁技巧在任意大小的集合上实现密码(例如所有 12 位数字)。

于 2013-10-05T13:00:20.643 回答