`
BucketLi
  • 浏览: 195894 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
5a76a659-f8e6-3bf3-b39a-8ae8f7a0f9d9
Percolator与分布...
浏览量:5686
社区版块
存档分类
最新评论

BytesKey以及其他一些代码细节

 
阅读更多
byte数组如何作为key?下面是一个实现。
public class BytesKey implements Serializable {
	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = -6296965387124592707L;

	private byte[] data;
	
	public BytesKey(byte[] data) {
		this.data = data;
	}

	/**
	 * @return the data
	 */
	public byte[] getData() {
		return data;
	}

	/**
	 * @param data the data to set
	 */
	public void setData(byte[] data) {
		this.data = data;
	}
	
	@Override
	public int hashCode() {
		int h = 0;
		if (null != this.data) {
	        for (int i = 0; i < this.data.length; i++) {
	            h = 31*h + data[i++];
	        }
		}
        return h;
	}
	
	@Override
	public boolean equals(Object o) {
		if (null == o || !(o instanceof BytesKey)) {
			return false;
		}
		BytesKey k = (BytesKey)o;
		if (null == k.getData() && null == this.getData()) {
			return true;
		}
		if (null == k.getData() || null == this.getData()) {
			return false;
		}
		if (k.getData().length != this.getData().length) {
			return false;
		}
		for (int i = 0; i < this.data.length; ++i) {
			if (this.data[i] != k.getData()[i]) {
				return false;
			}
		}
		return true;
	}
}


顺带使用BytesKey实现的简单Memory KV缓存
public class MemStore implements Store {
    private Map<BytesKey, byte[]> datas = new ConcurrentHashMap<BytesKey, byte[]>();


    /*
     * (non-Javadoc)
     * 
     * @see com.taobao.common.store.Store#add(byte[], byte[])
     */
    public void add(byte[] key, byte[] data) throws IOException {
        datas.put(new BytesKey(key), data);
    }


    /*
     * (non-Javadoc)
     * 
     * @see com.taobao.common.store.Store#get(byte[])
     */
    public byte[] get(byte[] key) throws IOException {
        return datas.get(new BytesKey(key));
    }


    /*
     * (non-Javadoc)
     * 
     * @see com.taobao.common.store.Store#iterator()
     */
    public Iterator<byte[]> iterator() throws IOException {
        final Iterator<BytesKey> it = datas.keySet().iterator();
        return new Iterator<byte[]>() {
            public boolean hasNext() {
                return it.hasNext();
            }


            public byte[] next() {
                BytesKey key = it.next();
                if (null == key) {
                    return null;
                }
                return key.getData();
            }


            public void remove() {
                it.remove();
            }
        };
    }


    /*
     * (non-Javadoc)
     * 
     * @see com.taobao.common.store.Store#remove(byte[])
     */
    public boolean remove(byte[] key) throws IOException {
        return null != datas.remove(new BytesKey(key));
    }


    /*
     * (non-Javadoc)
     * 
     * @see com.taobao.common.store.Store#size()
     */
    public int size() {
        return datas.size();
    }


    /*
     * (non-Javadoc)
     * 
     * @see com.taobao.common.store.Store#update(byte[], byte[])
     */
    public boolean update(byte[] key, byte[] data) throws IOException {
        datas.put(new BytesKey(key), data);
        return true;
    }


    public void close() throws IOException {
        // nodo
    }


    public long getMaxFileCount() {
        return Long.MAX_VALUE;
    }


    public void setMaxFileCount(long maxFileCount) {
    }
}



使用双重hash算key,
 private int hash(int keyHash, int i) {
        return abs(hash1(keyHash) + i * hash2(keyHash)) % table.length; // 双重散列
    }


使用BitSet进行快速判定key是否存在,存在的话进行下一轮的双重hash算key
 while (this.table[j] != null && !isEntryDeleted(j) && this.bitSet.get(offset) && i < m) {
            j = hash(keyHash, i++);
            offset = calcOffset(j);
        }

分享到:
评论

相关推荐

    frramework编写的C#加密通用类

    本文将详细介绍如何使用C#语言编写一个通用的加密类库,该库能够支持多种...这个类库为.NET Framework的应用程序提供了一种灵活且可复用的加密解决方案,减少了重复编写加密代码的需求,提高了代码的可维护性和安全性。

    Java实现的对称加密算法3DES定义与用法示例

    Java实现的对称加密算法3DES定义与用法示例 ...本文主要介绍了Java实现的对称加密算法3DES定义与用法示例,介绍了3DES的定义、好处、相关参数和代码实现。希望本文能够帮助读者更好地理解3DES算法。

    Java简单数据加密方法DES实现过程解析

    本文主要介绍了Java简单数据加密方法DES实现过程解析,通过示例代码对大家的学习或者工作具有一定的参考学习价值。 一、数据加密的必要性 在网络中传输数据时,需要对数据进行加密处理,以保护数据的安全。数据...

    java 对称加密算法实现详解

    byte[] byteskey = secrekeyone.getEncoded(); ``` 然后,我们可以使用 DESKeySpec 将密钥转换为 DESKeySpec 对象: ```java DESKeySpec deskeyspec = new DESKeySpec(byteskey); SecretKeyFactory factory = ...

    Java对称加密算法DES实例详解

    DESKeySpec desKeySpec = new DESKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); Key convertSecretKey = factory.generateSecret(desKeySpec); //加密 Cipher cipher =...

Global site tag (gtag.js) - Google Analytics