在 Stripe Read Write lock 中处理 Hash Collison

Handle Hash Collison in Stripe Read Write lock

提问人:arunK 提问时间:1/11/2023 更新时间:1/11/2023 访问量:26

问:

我们将条带锁用于我们的一个实现。我们在某个最终常量上采用读锁,在键上采用写锁。我们注意到我们遇到了一个死锁,因为两个不同密钥的哈希码被证明是相同的。因此,这就像将读锁升级为写锁一样,我们遇到了死锁。以下是 Stripe 库用于生成哈希码的代码。处理这种僵局的最佳方法是什么?

条带代码:

static int smear(int hashCode) 
{
    hashCode ^= hashCode >>> 20 ^ hashCode >>> 12;
    return hashCode ^ hashCode >>> 7 ^ hashCode >>> 4;
}

static final int indexFor(Object key) 
{
    int hash = smear(key.hashCode());
    int mask = ceilToPowerOfTwo(2003) -1;
    return hash & mask;
}

static int ceilToPowerOfTwo(int x) 
{
    return 1 << IntMath.log2(x, RoundingMode.CEILING);
}

public static void main(String[] args) {
    String publicKey = "$public";
    int hash = indexFor(publicKey );
    
    for(int i=0;i<1000;i++) {
        String key = "key"+i;
        if(indexFor(key) == hash) {
            System.out.println("Hash of "+key + " is same as hash of public");
        }
    }
} 

我们的逻辑:

Take readLock on publicKey 
Take writeLock on key
release the write lock
release the read lock
java readwritelock 重入ReadWriteLock

评论


答: 暂无答案