您需要的转换公式是:f(P) = (mP + s) mod n// n = range - so for uint64 2^64// s < range i.e. < 2^64// m = must be coprime with n这是仿射密码中使用的模块化算法。确保mod它在所需范围内,s是一个简单的移位并且m应该与互质n。Coprime 只是意味着n并且m不应该共享任何共同因素。因为n是 2^64 它唯一的因素是数字2- 所以m基本上不应该是偶数(即不能被 2 整除):所以对于uint64范围:这可能看起来很神奇,但您可以说服自己它适用于uint16:https://go.dev/play/p/EKB6SH3-SGu(因为uint64需要相当多的资源才能运行 :-)更新:对于带符号的数字(即int64),逻辑没有什么不同。因为我们知道我们有一个独特的一对一映射,uint64其中一种方法就是将输入和输出从 转换为uint64,int64反之亦然:// original unsigned versionfunc transform(p uint64) uint64 { return m*p + s}func signedTransform(p int64) int64 { return int64(transform(uint64(p)))}又是一个int16证明没有碰撞的例子:https://go.dev/play/p/Fkw5FLMK0Fu