传播输入的功能


14

我想知道从n位数字到n位数字的函数f是否具有以下特征:

  • f应该是双射的
  • 无论ff1应该是可计算的相当快
  • f应该返回与其输入没有显着相关性的数字。

原因是:

我想编写一个对数据进行操作的程序。数据的某些信息存储在二进制搜索树中,其中搜索关键字是字母的符号。随着时间的流逝,我在字母表中添加了更多符号。新符号只是获得下一个可用的免费号码。因此,树将始终对较小的键具有较小的偏差,这将导致比我认为需要的更多的重新平衡。

我的想法是与到裂伤符号数f使得它们的整个范围内的广泛普及[0,2641]。由于符号号仅在输入和输出期间才有关系,而符号输入只发生一次,因此应用此功能应该不会太昂贵。

我曾考虑过Xorshift随机数生成器的一次迭代,但是尽管从理论上讲应该是可行的,但我真的不知道一种撤消它的方法。

有人知道这样的功能吗?
这是一个好主意吗?


1
我不是专家,但也许您可以使用伪随机置换(例如,参见Feistel密码
2012年

如果本质上是在计算哈希函数,为什么不使用哈希呢?
vonbrand

@vonbrand哈希不可逆。请参阅要求编号
2。– FUZxxl

为什么它必须是可逆的?通过查找使其可逆有什么问题?
vonbrand

1
您可以将(f(x),x)存储为键。
adrianN 2013年

Answers:


6

您可以使用Fibonacci哈希,即

hF(k)=k512k512

对于ň成对-个不同的数字(约)均匀地散布在[ 0 1 ]。通过缩放到[ 1 .. M ]并四舍五入(向下),您可以在该间隔中获得均匀分布的数字。k=1,,nn[0,1][1..M]

例如,这些是缩放为[ 0..10000 ]的(左原始序列,右排序):hF(1),,hF(200)[0..10000]

enter image description here

这是Knuth称为乘法哈希的一个实例。对于电脑字的大小,一个有些整数相对素W¯¯中号所需地址的数量,我们使用wAwM

h(k)=M((kAw)mod1)

作为哈希函数。上面是(确保您可以以足够的精度进行计算)。尽管这也适用于除ϕ1以外的任何其他无理数,但它是仅两个导致“分布最均匀”的数之一。A/w=ϕ1=512ϕ1

在Donald Knuth撰写的《计算机编程艺术》第3卷中找到更多信息(第二版第513页的6.4章)。特别是,你会发现,为什么得到的数字是两两不同的(至少如果),以及如何计算反函数,如果你使用自然一个w ^代替φ - 1nMAwϕ1


1
如何有效地计算f1
frafl 2013年

1
@frafl希望我的编辑能够解决您的问题。但是很明显,这些哈希技术也没有经过特别设计以有效地反转。
拉斐尔

是的,我会赞成,但是我不建议您将其作为接受的答案。
frafl 2013年

1

对于位输入,此功能有效:k

hash(n)=(nmod2k2)2k2+ndiv2k2

这是可逆的,因为,并且具有非序列对{ n m } n < m,其中h a s hm < h a s hn 。要注意的是输出和输入可以关联,特别是如果你输入是在{ 1 ... 2 ķhash(hash(n))=n{n,m},n<mhash(m)<hash(n){1,,2k21}

参考:可逆哈希函数


这看起来很简单。我要测试那个。
2013年

1
1.取决于输入,它可能会产生很强的相关性(Spearman的ρ最高为)2.这是32位的,而不是64位的。3.您能以语言无关的方式编写它吗?1ρ
frafl 2013年

很清楚!对于64位(0x00000000FFFFFFFFFF),则应将(<<)移位32位。此功能简单,实用且在实践中足够快。
Reza

1
但是,你为什么不使用位的排列,若不能映射2 32 X?如上所述,这显然违反了OP要求的相关条件。x{1,,2321}232x
frafl 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.