将2 int转换为5长度的1 int

时间:2016-09-29 17:32:51

标签: c# math hash

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

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

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

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

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

由于

3 个答案:

答案 0 :(得分:2)

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

  1. 听起来你想要将5位int和3位int映射到4位或5位int,其资格如下:
      一个。在给定输入的情况下,难以确定生成算法   湾碰撞很少
  2. 给定一些函数F(x,y),如果x和y分别在1到5位数和1和3之间,则有x和y的100,000,000个组合。
  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,这对于大多数用途我能想到的都会被考虑太高了。
  6. 考虑到这些事情,最简单的想法可能是像奥斯卡提到的那样的基本模块化环。对于您的模数,您应该选择最大的素数和您想要保留的位数。例如,如果您想要一个5位数的结果,请使用99,877。或者如果你想避免碰撞并使用9位数字,你可以使用999,999,733。您可以使用prime list查找用于模数的素数。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

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

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

BTW为什么你需要取4或5位数? 减少数字量将导致共谋的可能性增加。