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 , 但是基本符合散列原則 ,