zoukankan      html  css  js  c++  java
  • 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 , 但是基本符合散列原则 ,

  • 相关阅读:
    C语言|博客作业08
    C语言|博客作业04
    C语言|博客作业02
    C语言|博客作业06
    C语言|博客作业03
    第一周作业
    C语言|博客作业05
    C语言|博客作业07
    C语言|博客作业09
    为什么get比post更快
  • 原文地址:https://www.cnblogs.com/alpha-cat/p/12942536.html
Copyright © 2011-2022 走看看