【发布时间】:2016-05-07 12:42:03
【问题描述】:
我需要创建一个函数,它以0-N 范围内的单个整数作为参数,并在同一范围内返回一个看似随机的数字。
每个输入数字都应该始终只有一个输出,并且应该始终相同。
这样的函数会产生这样的结果:
f(1) = 4
f(2) = 1
f(3) = 5
f(4) = 2
f(5) = 3
我相信这可以通过某种散列算法来完成?我不需要任何复杂的东西,只是不需要像f(1) = 2、f(2) = 3 等太简单的东西。
最大的问题是我需要它是可逆的。例如。上表应该是真正的从左到右以及从右到左,使用不同的函数进行从右到左的转换就可以了。
我知道最简单的方法是创建一个数组,将其打乱,然后将关系存储在数据库或其他东西中,但由于我需要 N 非常大,我想尽可能避免这种情况。
编辑:对于我的特殊情况,N 是一个特定的数字,它正好是 16777216 (64^4)。
【问题讨论】:
-
如果它需要是可逆的,那么它不是哈希;为什么不简单地进行固定值的按位异或?
-
我经常这样做。我有一组人被认定为 SSN。在为研究人员编写报告时,我会打乱数字。如果我需要返回并添加更多数据,我可以解读它们。如果您愿意,我可以发布对此类功能的描述作为答案。
-
@MarkBaker 你能详细说明一下吗?我已经为从 1 到 100 的所有数字尝试了一个简单的 $seed ^ $value,其中 34 作为种子,它产生了超出范围的数字。
-
您可能希望使用更接近最大值的种子
-
2 的幂范围,就像给出的例子一样非常简单,但是任意范围有点让人头疼。你能保证它总是两个范围的幂吗?