Hash 快速长计算
我有以下任务 我有10亿个或更多20字节的不同散列(存储在某个数据库中),这些散列的总数 小于Java的Hash 快速长计算,hash,polynomials,polynomial-math,Hash,Polynomials,Polynomial Math,我有以下任务 我有10亿个或更多20字节的不同散列(存储在某个数据库中),这些散列的总数 小于Java的Long.MAX\u值 在那之后,我有几乎无限的这样的散列流 是否有可能从这20字节的不同散列集合中创建一些双射映射 到介于0和长之间的一组数字。最大值 拉格朗日多项式的一种计算方法,但对于这种情况,可能会有一些非常快速有效的方法 我们需要对这个几乎无限的流中的每个散列进行快速long值计算 每个20字节的散列只是一个数字 在处理流之前,我们可以创建映射 20-byte | 8-byte
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字节数字空间的全部范围。这也是查找的解决方案。问题是关于数学方法。是的,但模块化在这里不起作用,我们需要另一个函数