我需要一个算法,可以进行一对一的映射(即。没有碰撞)32位有符号整数到另一个32位有符号整数。
我真正关心的是足够的熵,因此函数的输出似乎是随机的。基本上,我正在寻找一个类似于异或密码的密码,但这可以产生更多的任意外观的输出。安全不是我真正关心的,尽管默默无闻。
为澄清目的编辑:
预期结果实例:
F(100) = 98456
F(101) = -758
F(102) = 10875498
F(103) = 986541
F(104) = 945451245
F(105) = -488554
就像MD5一样,改变一件事可能会改变很多事情。
我正在寻找一个数学函数,所以手动映射整数不是我的解决方案。对于那些提出要求的人来说,算法速度并不是很重要。
发布于 2010-07-01 08:14:43
下面的文章给出了4或5个映射示例,给出了函数,而不是构建映射集:www.cs.auckland.ac.nz/~john-rugis/pdf/BijectiveMapping.pdf
发布于 2014-08-03 17:36:39
如果您的目标仅仅是得到一个看似随机排列的大致定义大小的数字,那么还有另一种可能的方法:将数字集合缩减为素数。
然后,您可以使用表单的映射。
f (i ) =(i*a+ b) %p
如果p确实是素数,这将是a != 0和所有b的双射,对于较大的a和b,它看起来是随机的。
例如,在我偶然发现这个问题的例子中,我使用1073741789作为小于1 << 30的数范围的质数。这使我只损失了35个数字,这对我来说是很好的。
我的编码是
((n + 173741789) * 507371178) % 1073741789解码是
(n * 233233408 + 1073741789 - 173741789) % 1073741789请注意,507371178 * 233233408 % 1073741789 == 1,所以这两个数字是逆数域模1073741789 (您可以用扩展欧几里得算法在这样的字段中计算出逆数)。
我相当随意地选择了a和b,我只是确定它们大约是p的一半大小。
发布于 2010-07-01 09:39:09
除了生成随机查找表之外,您还可以使用以下函数的组合:
https://stackoverflow.com/questions/3131193
复制相似问题