小编use*_*934的帖子

改善散列函数值的分布

假设我有很多字符串(比如100亿字符串,每行约50个字符).我想将字符串分配到10个桶中.每个桶应该容纳大约10%的琴弦.使用哈希函数h(),我可以这样做:

int bucket_for_s = h(s) % 10
Run Code Online (Sandbox Code Playgroud)

然而,这并不能保证分布的均匀性.假设我对所有字符串执行上述操作,并发现30%转到存储桶1,5%转到存储桶2,依此类推.我的问题是:

给定h()分布,有没有办法生成一个新的哈希函数h2(),它将更均匀地分配字符串?

或者,是否有一个进程可以生成一系列哈希函数h2(),h3()...这样1:每个哈希函数都优于前一个和2:我只需要生成一个合理数量的哈希功能?

我还应该提一下,不幸的是我不能简单地将输入分成10个部分,因为我的输入分布在几台机器上.我正在寻找一种确定性的解决方案,我可以单独应用于每台机器并获得相同的结果(因此最终"hello"将转到bucket x,无论它存储在哪台机器上).

hash bigdata

7
推荐指数
2
解决办法
4388
查看次数

无锁圆阵

我正在考虑实现一个无锁的圆形数组.一个问题是以无锁的方式保持头部和尾部指针.我想到的代码是:

int circularIncrementAndGet(AtomicInteger i) {
    i.compareAndSet(array.length - 1, -1);
    return i.incrementAndGet();
}
Run Code Online (Sandbox Code Playgroud)

然后我会做类似的事情:

void add(double value) {
    int idx = circularIncrementAndGet(tail);
    array[idx] = value;
}
Run Code Online (Sandbox Code Playgroud)

(注意,如果数组是完整的旧值将被覆盖,我很好).

有没有人发现这个设计有问题?我怀疑可能存在我没有看到的竞争状况.

java circular-buffer lock-free

5
推荐指数
1
解决办法
1840
查看次数

标签 统计

bigdata ×1

circular-buffer ×1

hash ×1

java ×1

lock-free ×1