首页 > 后端开发 > Golang > 如何从输入确定性地生成唯一整数?

如何从输入确定性地生成唯一整数?

Mary-Kate Olsen
发布: 2024-12-02 12:41:17
原创
933 人浏览过

How to Deterministically Generate Unique Integers from Inputs?

从输入确定性生成唯一整数

在寻求生成避免重复的确定性整数的解决方案时,问题围绕着寻找转换将输入数字映射到给定范围内的不同输出的方法,例如int64.

答案在于应用从仿射密码导出的模算术:

f(P) = (mP + s) mod n
登录后复制

其中:

  • n = 可能整数的范围(例如, 2^64 对于 int64)
  • s
  • n
  • m 与 n 互质(这意味着它们除了 1 之外没有其他公因数)

通过选择适当的 m 和 s,该公式保证输入数字到输出指定范围内的整数。例如,对于 int64:
m = 39293 (any non-even number)
s = 75321908 (any random number below 2^64)
登录后复制

使用这些值,转换函数:
func transform(p uint64) uint64 {
    return p*m + s
}
登录后复制

确保每个输入整数生成唯一的输出整数,如以下 Go Playground 所示例如:

https://go.dev/play/p/EKB6SH3-SGu

对于负数,逻辑保持不变。我们可以简单地在 uint64 和 int64 之间转换输入和输出,以维持唯一的映射:
func signedTransform(p int64) int64 {
    return int64(transform(uint64(p)))
}
登录后复制

这种方法可确保给定范围内的所有可能整数都确定性地映射到不同的输出整数,并且不会发生任何冲突。

以上是如何从输入确定性地生成唯一整数?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板