【问题标题】:Fast long calculation快速长计算
【发布时间】:2020-03-05 09:27:23
【问题描述】:

我有以下任务。

我有 10 亿个或更多 20 字节的不同哈希(存储在某个数据库中),其总数 小于Java的Long.MAX_VALUE;

在那之后,我有几乎无限的这种哈希流。

是否有可能从这些 20 字节的不同哈希集中创建一些双射映射 到 0 到 Long.MAX_VALUE 之间的数字集?

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

我们需要从这个几乎无限的流中快速计算每个哈希的long 值。

每 20 个字节的哈希值只是一个数字。

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

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

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

【问题讨论】:

  • 你真的在问是否可以将 20 字节的哈希值散列到 唯一 8 字节的哈希值?
  • 就像这里描述的 en.wikipedia.org/wiki/Lagrange_polynomial。一种哈希,但没有冲突。
  • 所以这不是哈希。我们可以提前构建映射。
  • 我不确定您要做什么。您能否添加一些示例以使其不那么抽象?
  • “我们将获得 8 字节哈希值,而无需仅使用算术计算进行查找” 您无法从 20 中计算出 唯一 8 字节值-byte 值,当 20 字节值本身是一个哈希值时,即它已经在使用 20 字节数字空间的全部范围。

标签: hash polynomials polynomial-math


【解决方案1】:

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

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

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

【讨论】:

  • 这又是查找的解决方案。问题是关于数学方法。
【解决方案2】:

它会像这样工作吗?

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

【讨论】:

  • 是的,但是模块化在这里不起作用我们需要另一个函数
猜你喜欢
  • 2016-02-21
  • 2010-12-23
  • 2011-11-27
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
相关资源
最近更新 更多