源 | Xpecya@知乎
大家好我是卖萌酱。昨天在知乎上刷到一个很有意思的问题:“五个同事决定计算他们的平均工资,在大家互相不告诉薪水的情况下,如何才能做到这一点?”。
确实互联网公司是不让员工讨论薪资的,但通过一些神操作却可以在不触碰公司安全红线的情况下算出平均值,还是非常有意思的(请勿实操,后果自负)
假设五个同事分别为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,带上自己的工资e,把a1+b1+c1+d1+e1+e的结果告诉D
D把自己的工资d加上去,把自己之前加上去的d1去掉,把a1+b1+c1+d+e1+e的结果告诉C
C把自己的工资c加上去,把自己之前加上去的c1去掉,把a1+b1+c+d+e1+e的结果告诉B
B把自己的工资b加上去,把自己之前加上去的b1去掉,把a1+b+c+d+e1+e的结果告诉A
A把自己的工资a加上去,把自己之前加上去的a1去掉,把a+b+c+d+e1+e的结果告诉E
E把自己的e1减掉,除以5,得到最终平均数。
这个做法的好处在于:
显然,全程中每个人都没有机会知道任何一个人的具体工资到底是多少。
哪怕数据传输过程中被他人截获,也没有机会用自己手中的随机数和工资反推其他人的工资(而其他答案中,比如第一个人随便想一个数,然后加上自己的工资传给第二个人,然后每个人加上自己的工资往下传,那么极端情况下,第一个人是有机会截获其他所有人传递的中间数据,根据自己手中的起始数退出所有其他人的工资。)这个算法唯一的破绽在于,只有所有人一起联手,交出自己手中的随机数,才能把所有人的工资推出来。
这个算法对任意大于等于2人的方式都成立。扩展性很好。
数据传输次数为2n-1(n表示人数),已经足够简略了。再少就不能保证安全了。
牛哇,没想到密码学还可以用到这里。卖萌酱最后再提醒一下请勿实操,毕竟其中很大一个风险是——最后发现自己的工资比平均工资还低,那就......
后台回复关键词【入群】
加入卖萌屋NLP、CV与搜推广与求职讨论群
后台回复关键词【顶会】
获取ACL、CIKM等各大顶会论文集!