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