传播输入的功能


14

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

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

原因是:

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

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

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

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


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

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

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

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

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

Answers:


6

您可以使用Fibonacci哈希,即

。hF(k)=k⋅5−12−⌊k⋅5−12⌋

对于你ň成对-个不同的数字(约)均匀地散布在[ 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((k⋅Aw)mod1)⌋

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

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


1
如何有效地计算?f−1
— frafl 2013年

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

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

1

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

hash(n)=(nmod2⌈k2⌉)⋅2⌈k2⌉+ndiv2⌈k2⌉

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

参考:可逆哈希函数


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

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

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

1
但是,你为什么不使用位的排列,若不能映射到2 32 X?如上所述,这显然违反了OP要求的相关条件。x∈{1,…,232−1}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.