python 可逆素数_可逆哈希函数?

we showed how you can take any two coprime positive integers x and m and compute a third positive integer y with the property that (x * y) % m == 1, and therefore that (x * z * y) % m == z % m for any positive integer z. That is, there always exists a “multiplicative inverse”, that “undoes” the results of multiplying by x modulo m.

我们取一个大数,例如4000000000和一个大的副素数,例如387420489:def rhash(n):

return n * 387420489 % 4000000000

>>> rhash(12)

649045868

我们首先用^{}计算乘法逆,结果是3513180409:>>> 3513180409 * 387420489 % 4000000000

1

现在,我们可以定义反比:def un_rhash(h):

return h * 3513180409 % 4000000000

>>> un_rhash(649045868) # un_rhash(rhash(12))

12

注意:这个答案计算速度很快,适用于4000000000以下的数字,如果需要处理较大的数字,请选择一个足够大的数字(和另一个协素数)。

您可能希望使用十六进制(打包int)执行此操作:def rhash(n):

return "%08x" % (n * 387420489 % 4000000000)

>>> rhash(12)

'26afa76c'

def un_rhash(h):

return int(h, 16) * 3513180409 % 4000000000

>>> un_rhash('26afa76c') # un_rhash(rhash(12))

12

如果你选择一个相对较大的副素数,那么这看起来是随机的,是非连续的,而且计算也很快。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值