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);
}
分享到:
相关推荐
本文将详细介绍如何使用C#语言编写一个通用的加密类库,该库能够支持多种...这个类库为.NET Framework的应用程序提供了一种灵活且可复用的加密解决方案,减少了重复编写加密代码的需求,提高了代码的可维护性和安全性。
Java实现的对称加密算法3DES定义与用法示例 ...本文主要介绍了Java实现的对称加密算法3DES定义与用法示例,介绍了3DES的定义、好处、相关参数和代码实现。希望本文能够帮助读者更好地理解3DES算法。
本文主要介绍了Java简单数据加密方法DES实现过程解析,通过示例代码对大家的学习或者工作具有一定的参考学习价值。 一、数据加密的必要性 在网络中传输数据时,需要对数据进行加密处理,以保护数据的安全。数据...
byte[] byteskey = secrekeyone.getEncoded(); ``` 然后,我们可以使用 DESKeySpec 将密钥转换为 DESKeySpec 对象: ```java DESKeySpec deskeyspec = new DESKeySpec(byteskey); SecretKeyFactory factory = ...
DESKeySpec desKeySpec = new DESKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); Key convertSecretKey = factory.generateSecret(desKeySpec); //加密 Cipher cipher =...