Hash 快速长计算

Hash 快速长计算,hash,polynomials,polynomial-math,Hash,Polynomials,Polynomial Math,我有以下任务 我有10亿个或更多20字节的不同散列(存储在某个数据库中),这些散列的总数 小于Java的Long.MAX\u值 在那之后,我有几乎无限的这样的散列流 是否有可能从这20字节的不同散列集合中创建一些双射映射 到介于0和长之间的一组数字。最大值 拉格朗日多项式的一种计算方法,但对于这种情况,可能会有一些非常快速有效的方法 我们需要对这个几乎无限的流中的每个散列进行快速long值计算 每个20字节的散列只是一个数字 在处理流之前,我们可以创建映射 20-byte | 8-byte

我有以下任务

我有10亿个或更多20字节的不同散列(存储在某个数据库中),这些散列的总数 小于Java的
Long.MAX\u值

在那之后,我有几乎无限的这样的散列流

是否有可能从这20字节的不同散列集合中创建一些双射映射 到介于0和
长之间的一组数字。最大值

拉格朗日多项式的一种计算方法,但对于这种情况,可能会有一些非常快速有效的方法

我们需要对这个几乎无限的流中的每个散列进行快速
long
值计算

每个20字节的散列只是一个数字

在处理流之前,我们可以创建映射

  20-byte | 8-byte
    (hash1 1) 
    .... 
    (hashN N) 

之后,当我们从无限流中获得下一个哈希值时,我们将获得8字节的哈希值,而无需仅使用算术计算进行查找。

因为除了“必须快速”之外,您没有给出大小或存储的实际限制,所以我假设您可以花时间对哈希集进行预处理以“使其快速”。我进一步假设散列是随机分布的,并且映射到8字节的数字也是不可预测的

我的第一种方法是使用本地SQLite数据库。这允许您使用其本机BTree索引快速检索结果。如果页面大小足够大,您可以在每个BTree节点上存储256个指针,每次查找的预期日志数为256(10^9)=3.737169106748283。随着更多的BTree结构得到缓存,这将有所改善


第二种方法,如果你有内存的话:内存中的BTree。

它会像这样工作吗

aNextHash = Stream.getHash();
long aValue = aNextHash % Long.MAX_VALUE;

你真的在问你是否可以把20字节的散列值降到一个唯一的8字节散列值?就像这里描述的那样。一种散列,但没有冲突。所以这不是散列。我们可以提前构建映射。我不确定你想做什么。您可以添加一些示例使其不那么抽象吗?“我们将获得8字节哈希值,而不使用仅使用算术计算的方法进行查找”您无法从20字节值计算唯一的8字节值,而20字节值本身就是哈希,也就是说,它已经使用了20字节数字空间的全部范围。这也是查找的解决方案。问题是关于数学方法。是的,但模块化在这里不起作用,我们需要另一个函数