五个同事决定计算他们的平均工资,在大家互相不告诉薪水的情况下,如何才能做到这一点?

发布时间:
2024-09-04 12:09
阅读量:
32

这个问题很简单……

假设五个同事分别为ABCDE,他们的工资分别为abcde

则A随便想一个数a1,他把a1告诉B

B也随便想一个数b1,把a1+b1的结果告诉C

C也随便想一个数c1,把a1+b1+c1的结果告诉D

D也随便想一个数d1,把a1+b1+c1+d1的结果告诉E

E也随便想一个数e1,把a1+b1+c1+d1+e1的结果告诉A

A把自己的工资a加上去,把自己之前加上去的a1去掉,把a+b1+c1+d1+e1的结果告诉B

B把自己的工资b加上去,把自己之前加上去的b1减掉,把a+b+c1+d+e1的结果告诉C

C把自己的工资c加上去,把自己之前加上去的c1减掉,把a+b+c+d1+e1的结果告诉D

D把自己的工资d加上去,把自己之前加的d1去掉,把a+b+c+d+e1的结果告诉E

E把自己的e1减掉,加上自己的工资e,除以5,得到最终平均数。

这个做法的好处在于:

  1. 显然,全程中每个人都没有机会知道任何一个人的具体工资到底是多少。
  2. 哪怕数据传输的过程中被其他人截获,也没有机会用自己手中的随机数和工资反推其他人工资(而其他答案中,比如第一个人随便想一个数,然后加上自己工资传给第二个人,然后每个人加上自己工资往下传,那么极端情况下,第一个人是有机会截获其他所有人传递的中间数据,根据自己手中的起始数推出所有其他人工资的)。这个算法唯一的破绽在于,只有所有人一起联手,交出自己手中的随机数,才能把所有人的工资推出来。
  3. 这个算法对任意大于2人的方式都成立。扩展性很好。
  4. 数据传输次数为2n-1(n表示人数),已经足够简略了。再少就不能保证安全了。
END