Hbase 如何用对rowkey加盐

EX. 业务原因: hbase 的 region 是将范围内的rowkey 放一起

但是如果某一段时期数据量大 , 就会造成region(分区) 数据的分布不均 , ,所以需要加盐 ,加哪里 ,放最前面 解释:我这里是1000个分区

有问题的地方: 

我用 1-100连续的数, 去求hashcode() , 结果和原数是很接近的 , 并不能达到散列的原则

所以我才用  md5 再  hashcode  , 最后 %1000 , 这样分配到的位置基本是很平均的 .  

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Md5 {
public static void main(String[] args) {
int [] a=new int[1000];
int num=0;
for (int i = 0; i <1000000 ; i++) {
int s=conVertTextToMD5(String.valueOf(i)).hashCode()%1000;
//这是调用下面的求MD5的方法 , 再求hashcode , 最后除以1000取得余数
// 一个数除以1000,结果可能是 0-999 的余数 . 不包含1000!!!
a[Math.abs(s)]+=1;
//这是取绝对值 , 然后是哪个值 , 就在对应的数组 +1 , 最后统计个数
}
for (int i = 0; i <1000 ; i++) {
System.out.println(i+"---"+a[i]);
}


}

public static String conVertTextToMD5(String plainText) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(plainText.getBytes());
byte b[] = md.digest();

int i;

StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
// 32位加密
return buf.toString();
// 16位的加密
// return buf.toString().substring(8, 24);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
}

 

 

可以看出 , 他并不是完全的1000 , 但是基本符合散列原则 ,

posted @ 2020-05-23 14:55  挪威森林猫Zzz  阅读(1821)  评论(0编辑  收藏  举报