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

Java 从一组唯一数字到另一组唯一数字的单向函数,java,function,math,hash,Java,Function,Math,Hash,我正在寻找一个函数(哈希函数?不确定),它将一组(唯一)数字映射到另一组(唯一)数字。我看了一眼完美的散列——事实上这是不可能做到的:(-而且它似乎非常接近我所追求的 具体而言,我想了解以下内容: 将任何给定的12位数字映射到另一个数字,12位或更多(我不关心结果的大小,但它必须适合Java long) 必须能够保证相同的12位数字每次映射到相同的数字 必须能够保证不同的12位数字始终映射到不同的数字,即结果集中没有冲突 必须能够保证函数是单向的,这(在我看来)意味着,在给定函数结果的情况下,

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

具体而言,我想了解以下内容:

  • 将任何给定的12位数字映射到另一个数字,12位或更多(我不关心结果的大小,但它必须适合Java long)
  • 必须能够保证相同的12位数字每次映射到相同的数字
  • 必须能够保证不同的12位数字始终映射到不同的数字,即结果集中没有冲突
  • 必须能够保证函数是单向的,这(在我看来)意味着,在给定函数结果的情况下,你无法计算你从中开始的数字
像最小散列函数这样的函数在我的例子中不起作用,因为每个数字都必须在不同的计算机上计算,这意味着函数本身必须保证这些特性,而不检查结果中的冲突,或者对结果集进行任何集中控制

这类函数的一个示例是: 取数字,加1,输出数字。 唯一的问题是,你只需减去一就可以很容易地得到第一个数字。我希望这是非常困难的,或者最好是不可能得到前一个数字

有什么想法吗


将函数从数学转换为java我不介意自己去做。除非你能推荐一个已经存在的java库。

这对我来说似乎是一个密码问题。 如果您想将一个字符串映射到另一个字符串,并且必须能够保证这是单向的并且没有冲突,那么您需要加密输入字符串。 例如,您可以使用DES


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

您需要的是一个密码。一个好的老式对称密码。如AES

想象一下,你的数字不是12位,而是128位长。假设你用自己选择的密钥设置了一个AES密码,然后用它来加密数字。结果如何

  • 您将把任何给定的128位数字映射到另一个正好128位的数字(AES的块大小为128位)
  • 您可以保证每次相同的128位数字映射到相同的数字(加密是确定性的)
  • 您可以保证两个不同的128位数字始终映射到不同的数字(加密是可逆的-没有两个明文加密到同一密文,否则您如何解密它们?)
  • 您可以保证,对于没有密钥的人来说,该函数是单向的(没有密钥,加密是不可逆的——如果有密钥,那么就没那么有用了)
现在,128位比您想要的大,因此AES不是适合您的密码。您需要做的就是选择一个具有12位块大小的密码

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


我不久前写过一篇文章,对此做了更详细的解释;我甚至写过,尽管现在看了看,我不知道它有多容易理解。其中的关键类是
TinyChipher
,它实现了一个块大小高达32位(并且可以轻松扩展到64位)的密码,以及
TrickCipher
,它使用仓促的布丁技巧在任意大小的集合(例如所有12位数字)上实现密码.

你在寻找算法。

我觉得你不可能一次拥有唯一性和不可逆性。如果你有nuqie映射,根据定义有一个反向函数!一个简单的反向方法是尝试所有12位数字,直到你找到你想要反向的数字。考虑到很多核,应该不会花太长时间。怎么样。.加密?你为什么需要它?你需要它是不可逆的吗?