将2 int转换为1 inr of 5 of length

问题描述 投票:0回答:3

这可能不属于这里所以如果我需要在其他地方问这个,请告诉我。

假设我们有10032(将是X)和154(将是Y)作为输入,我需要的是得到1 int作为输出。该输出也需要长度为4或5。

随着输出和X或Y知道,我需要阻止任何人发现公式。这是Y将保持不变但X经常变化的情况。

我正在读哈希,但我不确定哪一个对我最好。或者如果一个简单的数学公式可以完成这项工作。在程序中,我们目前使用以下方式使用它:X + Y * 2/3然后舍入到较低的数字。

该解决方案还需要非常少量的碰撞。

谢谢

c# math hash
3个回答
1
投票

我假设一种最小化碰撞的好方法是在对两个数字执行的任何操作之后使用模数10 ^ 6。

最难的部分是原始的int之间的操作,但查找关于哈希的理论,我相信你可以找到很好的建议。

为了使其真正难以反转,您可以分几个阶段执行操作,每个阶段都取决于前一个阶段的结果。只是一个想法......


2
投票

对于这个问题,你可能在Cryptography Stack Exchange有更好的运气,但这里有一些想法。

  1. 听起来你想要将5位int和3位int映射到4或5位int,其资格如下: 一个。在给定输入的情况下难以确定生成算法 湾碰撞很少
  2. 给定一些函数F(x,y),如果x和y分别在1和5位以及1和3之间,则存在100,000,000个x和y的组合。
  3. 如果F(x,y)产生5位数,则有100,000个可能的解。
  4. 平均而言,这意味着F(x,y)的每个值都有1000个映射到它的x,y组合。
  5. 因此,在最好的情况下,这意味着给定x1,y1和x2,y2,F(x1,y1)= F(x2,y2)的概率是1/1000,对于大多数用途,我认为这将被认为太高。

考虑到这些事情,最简单的想法可能是像奥斯卡提到的那样的基本模块化环。对于您的模数,您应该选择最大的素数和您想要保留的位数。例如,如果您想要一个5位数的结果,请使用99,877。或者如果你想避免碰撞并使用9位数字,你可以使用999,999,733。您可以使用prime list查找用于模数的素数。


1
投票

十进制d =(X * Y) - (反向X *反向Y); (当我说反向10032将是23001)

如果有更多,请取前4或5位数字。

或者你可以创建一个如下所示的字符串:10032154然后使用哈希方法,然后取前4或5位数? (你也可以反转这个字符串是:45123001)

顺便说一句你为什么需要拿4号或5号数字呢?减少数字量将导致共谋的可能性增加。

© www.soinside.com 2019 - 2024. All rights reserved.