Java 从一组唯一数字到另一组唯一数字的单向函数
我正在寻找一个函数(哈希函数?不确定),它将一组(唯一)数字映射到另一组(唯一)数字。我看了一眼完美的散列——事实上这是不可能做到的:(-而且它似乎非常接近我所追求的 具体而言,我想了解以下内容:Java 从一组唯一数字到另一组唯一数字的单向函数,java,function,math,hash,Java,Function,Math,Hash,我正在寻找一个函数(哈希函数?不确定),它将一组(唯一)数字映射到另一组(唯一)数字。我看了一眼完美的散列——事实上这是不可能做到的:(-而且它似乎非常接近我所追求的 具体而言,我想了解以下内容: 将任何给定的12位数字映射到另一个数字,12位或更多(我不关心结果的大小,但它必须适合Java long) 必须能够保证相同的12位数字每次映射到相同的数字 必须能够保证不同的12位数字始终映射到不同的数字,即结果集中没有冲突 必须能够保证函数是单向的,这(在我看来)意味着,在给定函数结果的情况下,
- 将任何给定的12位数字映射到另一个数字,12位或更多(我不关心结果的大小,但它必须适合Java long)
- 必须能够保证相同的12位数字每次映射到相同的数字
- 必须能够保证不同的12位数字始终映射到不同的数字,即结果集中没有冲突
- 必须能够保证函数是单向的,这(在我看来)意味着,在给定函数结果的情况下,你无法计算你从中开始的数字
将函数从数学转换为java我不介意自己去做。除非你能推荐一个已经存在的java库。这对我来说似乎是一个密码问题。 如果您想将一个字符串映射到另一个字符串,并且必须能够保证这是单向的并且没有冲突,那么您需要加密输入字符串。 例如,您可以使用DES
如果输出必须是数字,您可以将输出字节解释为十六进制,然后转换为10进制。您需要的是一个密码。一个好的老式对称密码。如AES 想象一下,你的数字不是12位,而是128位长。假设你用自己选择的密钥设置了一个AES密码,然后用它来加密数字。结果如何
- 您将把任何给定的128位数字映射到另一个正好128位的数字(AES的块大小为128位)
- 您可以保证每次相同的128位数字映射到相同的数字(加密是确定性的)
- 您可以保证两个不同的128位数字始终映射到不同的数字(加密是可逆的-没有两个明文加密到同一密文,否则您如何解密它们?)
- 您可以保证,对于没有密钥的人来说,该函数是单向的(没有密钥,加密是不可逆的——如果有密钥,那么就没那么有用了)
我不久前写过一篇文章,对此做了更详细的解释;我甚至写过,尽管现在看了看,我不知道它有多容易理解。其中的关键类是
TinyChipher
,它实现了一个块大小高达32位(并且可以轻松扩展到64位)的密码,以及TrickCipher
,它使用仓促的布丁技巧在任意大小的集合(例如所有12位数字)上实现密码.你在寻找算法。我觉得你不可能一次拥有唯一性和不可逆性。如果你有nuqie映射,根据定义有一个反向函数!一个简单的反向方法是尝试所有12位数字,直到你找到你想要反向的数字。考虑到很多核,应该不会花太长时间。怎么样。.加密?你为什么需要它?你需要它是不可逆的吗?