首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >整数的对称双射算法

整数的对称双射算法
EN

Stack Overflow用户
提问于 2010-06-28 09:12:12
回答 9查看 6.5K关注 0票数 34

我需要一个算法,可以进行一对一的映射(即。没有碰撞)32位有符号整数到另一个32位有符号整数。

我真正关心的是足够的熵,因此函数的输出似乎是随机的。基本上,我正在寻找一个类似于异或密码的密码,但这可以产生更多的任意外观的输出。安全不是我真正关心的,尽管默默无闻。

为澄清目的编辑:

  1. 算法必须是系统的,这样我就可以在没有键盘的情况下逆转操作。
  2. 算法必须是双射的,每32位输入数都必须生成一个32位唯一的数字.
  3. 函数的输出必须足够模糊,只在输入中添加一个就会对输出产生很大的影响。

预期结果实例:

F(100) = 98456

F(101) = -758

F(102) = 10875498

F(103) = 986541

F(104) = 945451245

F(105) = -488554

就像MD5一样,改变一件事可能会改变很多事情。

我正在寻找一个数学函数,所以手动映射整数不是我的解决方案。对于那些提出要求的人来说,算法速度并不是很重要。

EN

回答 9

Stack Overflow用户

发布于 2010-07-01 08:14:43

下面的文章给出了4或5个映射示例,给出了函数,而不是构建映射集:www.cs.auckland.ac.nz/~john-rugis/pdf/BijectiveMapping.pdf

票数 5
EN

Stack Overflow用户

发布于 2014-08-03 17:36:39

如果您的目标仅仅是得到一个看似随机排列的大致定义大小的数字,那么还有另一种可能的方法:将数字集合缩减为素数。

然后,您可以使用表单的映射。

f (i ) =(i*a+ b) %p

如果p确实是素数,这将是a != 0和所有b的双射,对于较大的a和b,它看起来是随机的。

例如,在我偶然发现这个问题的例子中,我使用1073741789作为小于1 << 30的数范围的质数。这使我只损失了35个数字,这对我来说是很好的。

我的编码是

代码语言:javascript
复制
((n + 173741789) * 507371178) % 1073741789

解码是

代码语言:javascript
复制
(n * 233233408 + 1073741789 - 173741789) % 1073741789

请注意,507371178 * 233233408 % 1073741789 == 1,所以这两个数字是逆数域模1073741789 (您可以用扩展欧几里得算法在这样的字段中计算出逆数)。

我相当随意地选择了a和b,我只是确定它们大约是p的一半大小。

票数 5
EN

Stack Overflow用户

发布于 2010-07-01 09:39:09

除了生成随机查找表之外,您还可以使用以下函数的组合:

  • 异或
  • 对称位排列(例如移位16位,或翻转0-31到31-0,或翻转0-3到3-0,4-7到7-4,.)
  • 更多?
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3131193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档