首页 >后端开发 >Golang >如何通过 1:1 映射生成唯一的、确定性的数字?

如何通过 1:1 映射生成唯一的、确定性的数字?

Barbara Streisand
Barbara Streisand原创
2024-11-17 18:30:031061浏览

How to Generate Unique, Deterministic Numbers with a 1:1 Mapping?

具有 1:1 映射的恒定确定性数字生成

目标

生成将输入数字映射到唯一的确定性函数输出指定范围内的数字,不带

方法

利用仿射密码的模运算:

  1. 变换公式: f( P) = (mP·s) mod n
  2. 参数:

    • m:必须与n互质(不能被与n相同的数字整除)。
    • s:小于 n 的随机数。
    • n:所需的范围输出。

uint64 示例

  • n = 2^64(uint64 范围)
  • m = 39293(奇数number)
  • s = 75321908 (随机数

转换函数:

func transform(p uint64) uint64 {
    return m * p + s  // implicitly mod'd 2^64 by the type's size
}

示例为int64

对于有符号数,在 uint64 和 int64 之间转换输入和输出以保持唯一映射:

func signedTransform(p int64) int64 {
    return int64(transform(uint64(p)))
}

保证

  • 该函数确保所有输入的 1:1 映射数字。
  • 没有两个输入数字会生成相同的输出数字。
  • 输出数字将在指定范围内均匀分布。
  • 函数是确定性的,总是生成给定输入的相同输出。

以上是如何通过 1:1 映射生成唯一的、确定性的数字?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn