Hash 整数对中唯一散列的公式

Hash 整数对中唯一散列的公式,hash,Hash,我想我可以使用Cantor创建一个唯一的散列n=((x+y)*(x+y)+x-y)/2 但是我能把这个散列倒过来吗?如果没有,有人能为可逆散列提供类似的公式对吗 谢谢。这是两个整数的唯一、可逆且完全不实用的哈希: 对于两个数字x和y,返回第x个素数和第y个素数的乘积。如果您假定顺序无关紧要,则这是唯一的和可逆的。如果是,那么您可以添加一个字符,指示“哈希”的两个素数因子中的哪一个是x或y 请注意,哈希空间大于输入空间。哦,好吧。如果x、y和n都是相同的数据类型,那么在一个位中存储多个位就会得到这

我想我可以使用Cantor创建一个唯一的散列n=((x+y)*(x+y)+x-y)/2

但是我能把这个散列倒过来吗?如果没有,有人能为可逆散列提供类似的公式对吗


谢谢。

这是两个整数的唯一、可逆且完全不实用的哈希:

对于两个数字x和y,返回第x个素数和第y个素数的乘积。如果您假定顺序无关紧要,则这是唯一的和可逆的。如果是,那么您可以添加一个字符,指示“哈希”的两个素数因子中的哪一个是x或y


请注意,哈希空间大于输入空间。哦,好吧。如果x、y和n都是相同的数据类型,那么在一个位中存储多个位就会得到这样的结果

n = ((x + y)*(x + y) + x - y)/2...
当x和y靠近数据类型::max n时,将溢出,您将丢失信息,并且无法恢复x和y

另一方面,如果x和y总是在一个范围内,比如说0-FOO

n = Foo * x + y 
可以是一个可恢复的哈希值,但n没有溢出

   n % Foo

将为您提供y。一旦知道y(n-y)/Foo将为您提供x,您应该指定是否可以控制输入的上限,如果可以,输入的大小、输出的大小、输入和输出是否有符号等(当然还有函数是否应该是可逆的)。一个好的答案取决于这一切

根据定义,散列通常是不可逆的……为什么需要散列8字节的数据?这就进入了“这么小,你也可以使用它”的领域,特别是如果你使用可逆散列(没有安全性)的话。我需要从两个不同数据源的整数id生成一个唯一的id。来自两个不同数据源的ID可能重叠,因此我不能单独使用ID。我还需要一种方法来分解我创建的唯一id。您是否试图将两个任意数字压缩为一个大小相同的数字而不丢失信息?是的,没错,这就是我要做的。注意:Foo必须至少比y大1,否则你会遇到一个棘手的问题。谢谢-我不清楚如何计算foo。。。你能详细说明一下吗?没关系,你只是说FOO*(x+y)是获得唯一值的一种足够的方法,对吧?不。。Foo*x+y。仅图像x,y在1-99之间。如果你把FOO选为100,如果x=23。。。y=42。。。您的已成为2342,足够的信息可以轻松recovered@bdare... 好的角球接球…我想在stackoverflow上有一个20秒的窗口,在此之前你可以发布答案。。。