【发布时间】:2014-01-13 09:38:45
【问题描述】:
变得更大听起来很奇怪,但这就是我想要做的。我想获取整个 16 位整数序列,并以这样的方式散列每个整数,使其均匀映射到 256 位空间。
这样做的原因是我试图将 16 位数字空间的子集放入 256 位布隆过滤器中,以进行快速成员资格测试。
我可以在每个整数上使用一些众所周知的散列函数,但我正在寻找一种极其高效的实现(只需几条指令),以便它在 GPU 着色器程序中运行良好。我觉得散列输入已知只有 16 位这一事实可以告知散列函数是以某种方式设计的,但我看不到解决方案。
有什么想法吗?
编辑
根据回复,我最初的问题令人困惑。对于那个很抱歉。我将尝试用一个更具体的例子来重申它:
我有来自集合 S 的 n 个数字的子集 S1,它在 (0, 2^16-1) 范围内。我需要用一个用单个散列函数构造的 256 位布隆过滤器来表示这个子集 S1。布隆过滤器的原因是空间考虑。我选择了 256 位布隆过滤器,因为它符合我的空间要求,并且误报概率足够低。我正在寻找一个非常简单的散列函数,它可以从集合 S 中获取一个数字并将其表示为 256 位,以便每个位具有大致相等的 1 或 0 概率。
哈希函数要求简单的原因是这个哈希函数每个像素必须运行数千次,所以任何可以修剪指令的地方都是一个胜利。
【问题讨论】:
-
您能否澄清一下身份功能如何不适用于您正在尝试做的事情?速度很快。
-
@PascalCuoq:通常布隆过滤器使用一组哈希来测试成员资格。在完美的情况下,OP 可以找到填充 256 位空间并且冲突次数最少的
n哈希函数(理想情况下没有,但这在这里是不可能的)。也就是说,存在2^1616 位整数,因此自256 < 2^16以来,标识函数不会映射到这256 位(即1 位以将整数标记为集合中)。 -
@RageD 问题不是关于识别 n 个哈希函数,它要求一个,并且没有说明身份如何不是一个令人满意的解决方案。
-
@PascalCuoq:为了完整起见,我添加了这一点,因为他使用的是布隆过滤器。我怀疑 OP 认为 16 位整数的空间是 16 位而不是
2^16。假设我正确理解了 OP,他最多有2^16整数,他想将这些整数散列成 256 位 位向量。如果 OP 确实在内存中保存了2^256位,他应该使用第一个2^16位(您建议的身份函数)作为注入并将每个位视为简单的布尔值(0 或 1)。 -
@PascalCuoq:这可能不会一致。再说一次,我们没有measure,所以无论如何也没有统一的定义。简单地说:
x << 240在度量为x-y时非常统一,但在度量为x^y时则完全不统一。
标签: c++ algorithm hash glsl shader