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

  • 相关阅读:
    字集码(字符编码)
    图片轮播(可实现手动与自动的切换)
    Eclipse常用快捷键
    Java并发编程:Callable、Future和FutureTask
    Java并发之CountDownLatch、CyclicBarrier和Semaphore
    java注解
    JVM加载class原理
    阿里中间件技术及双十一实践--软负载——分布式系统的引路人
    阿里中间件技术及双十一实践--中间件总体介绍
    Java的LockSupport.park()实现分析
  • 原文地址:https://www.cnblogs.com/alpha-cat/p/12942536.html
Copyright © 2011-2022 走看看