【发布时间】:2021-04-06 13:49:28
【问题描述】:
我想在一个 URL 中有 8 个可能的字符,我们称它们为 1、2、3、4、5、6、7、8。然后我想将这些用作哈希表查找的键。我想知道如何实现基于 3 位的平衡/高度随机散列算法(8 个字符可以编码为 3 位),而不是使用 typical 基于 8 位的哈希算法。所以一些东西(在 JS 中用于演示目的)在给定输入是 3 位长的倍数的情况下会产生一个平衡良好的哈希表。所以你可能有:
8
88
888
18
81
8181
尽可能多的哈希键。字符来自 8 个字符集。所以我要做的就是从这个开始:
function hashBinary(bin) {
// iterate through 3 bits at a time
// build a nice random hash
}
function hashString(str) {
let binary8Bit = str.split('').map(x => parseInt(x))
// do something? to convert the 8-bit-chunk list to a 3-bit chunk list.
let binary3Bit = new ArrayBuffer()
// ... something
return hashBinary(binary3Bit)
}
hashString('8181')
hashString('88')
你将如何开始正确地做到这一点?
尝试学习如何从头开始实现一个好的哈希算法,以及如何在非 8 位字符串上实现。
【问题讨论】:
-
如果“典型的基于 8 位的哈希算法”设计得很好,如 siphash,没有理由产生不令人满意的分布。即使每个字符只有两种可能性(1 位)也是如此。你打算把
return hash(binary3Bit)变成return hashBinary(binary3Bit)吗? -
"尝试学习如何实现一个好的散列算法" - 在我们开始之前,请先定义一下“好”的含义。快速地?加密安全?一些other property?
-
如果选择的哈希算法好的话,它在每一步只传递 3 位数据而不是 8 位数据时表现同样好。
-
@Bergi 这用于内存中的哈希表,例如实现 javascript 对象功能。它不需要任何安全性,它需要快速而且我猜是均匀分布的?无论您认为最适合实现性能快速的简单哈希映射。
-
你的意思是“hash”是指它有一个固定(或最大)的大小,并且可能会发生冲突吗?
标签: javascript hash binary bit-manipulation