Hash 没有桶的完美散列是可能的吗?

Hash 没有桶的完美散列是可能的吗?,hash,lookup,perfect-hash,Hash,Lookup,Perfect Hash,我被要求寻找一个完美的散列/单向函数来散列10^11个数字。 然而,由于我们将使用嵌入式设备,它没有内存来存储相关的存储桶,所以我想知道,如果没有它们,是否可能有一个像样的(最小的)完美散列 计划是使用设备对数字进行散列,我们使用彩虹表或使用散列作为偏移量的文件 干杯 编辑: 我将尝试提供更多信息:) 1) 10^11实际上现在是10^10,这使它更容易。这个数字是可能的组合。所以我们可以得到一个介于10000000001和1000000000(10^10)之间的数字 2) 我们的计划是将其作为

我被要求寻找一个完美的散列/单向函数来散列10^11个数字。 然而,由于我们将使用嵌入式设备,它没有内存来存储相关的存储桶,所以我想知道,如果没有它们,是否可能有一个像样的(最小的)完美散列

计划是使用设备对数字进行散列,我们使用彩虹表或使用散列作为偏移量的文件

干杯

编辑:

我将尝试提供更多信息:)

1) 10^11实际上现在是10^10,这使它更容易。这个数字是可能的组合。所以我们可以得到一个介于10000000001和1000000000(10^10)之间的数字


2) 我们的计划是将其作为单向函数的一部分,使号码安全,以便我们可以通过不安全的方式发送。 然后,我们将使用彩虹表在另一端查找原始数字。 问题是设备的源代码通常有512k-4Meg的内存可供使用


3) 它必须是完美的-我们100%不能有碰撞

编辑2:

4) 我们不能使用加密,因为有人告诉我们,加密在设备上是不可能的,如果可以的话,密钥管理将是一场噩梦

编辑3:


由于这是不明智的,现在这纯粹是一个学术问题(我保证)

显然不存在“完美”散列,除非你至少有和输入一样多的散列桶;如果您不这样做,那么您的两个输入将不可避免地共享同一个哈希桶

但是,不太可能存储0到10^11之间的所有数字。那么模式是什么呢?如果有一个模式,那么可能会有一个适合实际数据集的完美哈希函数


不过,找到一个“完美”的散列函数其实并不重要。哈希表非常快。一个冲突率非常低的函数——当对整数进行散列时,这意味着几乎任何简单的函数,如模——都是好的,并且您将获得O(1)平均性能。

显然没有“完美”散列,除非您至少有与输入一样多的散列桶;如果您不这样做,那么您的两个输入将不可避免地共享同一个哈希桶

但是,不太可能存储0到10^11之间的所有数字。那么模式是什么呢?如果有一个模式,那么可能会有一个适合实际数据集的完美哈希函数


不过,找到一个“完美”的散列函数其实并不重要。哈希表非常快。一个碰撞率非常低的函数——当对整数进行哈希运算时,这意味着几乎任何简单的函数,如模——都可以,并且可以获得O(1)的平均性能。

好的,既然你已经澄清了你要做的事情,我就重写了我的答案

总结:使用真正的加密算法

首先,让我解释一下为什么你的哈希系统是个坏主意

你的哈希系统是什么? 据我所知,你提议的系统是这样的:

您的嵌入式系统(我称之为C)正在发送某种类型的数据,其值空间为10^11。这些数据在传输到某种服务器(我称之为S)时需要保密

您的建议是将值
散列(salt+数据)
发送给S。S将使用彩虹表反转此散列并恢复数据
salt
是C和S都知道的共享值

这是一个加密算法 一个加密算法,当你归结起来,是任何算法,让你保密。因为您的目标是保密性,所以满足您目标的任何算法都是加密算法,包括此算法

这是一个非常糟糕的加密算法 首先,有不可避免的碰撞机会。此外,冲突值集每天都不同

第二,即使对于合法服务器,解密也是非常占用CPU和内存的。更改salt的成本甚至更高

第三,尽管您声明的目标是避免密钥管理,但您的salt是一个密钥!您根本没有解决密钥管理问题;任何有盐的人都能像你一样破解这个信息

第四,它只能从C到s使用。您的嵌入式系统C将没有足够的计算资源来反转哈希,只能发送数据

这并不比嵌入式设备上的真正加密算法快多少 大多数安全的散列算法在计算上与合理的分组密码一样昂贵,甚至更糟。例如,SHA-1要求对每个512位块执行以下操作:

  • 分配12个32位变量
  • 为扩展消息分配80个32位字
  • 64次:执行三次数组查找、三次32位异或和一次旋转操作
  • 80次:执行多达5个32位二进制操作(根据轮数,xor、and、or、not和and的某些组合);然后进行一次旋转、数组查找、四次添加、另一次旋转和几个内存加载/存储
  • 执行五次32位2补加法
消息的每512位有一个块,最后可能还有一个额外的块。这是每个块1136个二进制操作(不包括内存操作),或每个字节大约16个操作

为了进行比较,RC4加密算法每字节需要四个操作(三个加法,加上消息上的xor),再加上两个数组读取和两个数组写入。它也只需要258字节的工作内存,而SHA-1的峰值为368字节

密钥管理是基础 对于任何保密系统,你都必须有某种秘密。如果您没有秘密,那么其他任何人都可以实现相同的解码算法,您的数据将公开于世

所以,你有两个选择,把秘密放在哪里。一种选择是使加密/解密算法保密。但是,如果算法的代码(或二进制文件)是