java实现62进制和10进制转换算法

作者: ʘᴗʘ发布时间:2021-10-26 20:05 浏览量:871 点赞:641 售价:0

62进制简单介绍

62进制算法,就是26个大写字母、26个小写字母、10个数字,加起来就是62个字符。常见的应用场景是一些在十进制下很长的数字,转换为62进制后,长度会大幅缩小。

转换算法

package com.coderbbb.blogv2.utils;

import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class IdConvertUtil {

    private static final String CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    private static final int SCALE = 62;

  
    /**
     * 数字转62进制
     * @param num
     * @return
     */
    public static String encode(long num) {
        StringBuilder sb = new StringBuilder();
        int remainder;
        while (num > SCALE - 1) {
            //对 SCALE 进行求余,然后将余数追加至 sb 中,由于是从末位开始追加的,因此最后需要反转字符串
            remainder = Long.valueOf(num % SCALE).intValue();
            sb.append(CHARS.charAt(remainder));
            //除以进制数,获取下一个末尾数
            num = num / SCALE;
        }
        sb.append(CHARS.charAt(Long.valueOf(num).intValue()));
        String value = sb.reverse().toString();
        int minLength = 1;
        return StringUtils.leftPad(value, minLength, '0');
    }

    /**
     * 62进制转为数字
     * @param str
     * @return
     */
    public static long decode(String str) {
        //将 0 开头的字符串进行替换
        str = str.replace("^0*", "");
        long value = 0;
        char tempChar;
        int tempCharValue;
        for (int i = 0; i < str.length(); i++) {
            //获取字符
            tempChar = str.charAt(i);
            //单字符值
            tempCharValue = CHARS.indexOf(tempChar);
            //单字符值在进制规则下表示的值
            value += (long) (tempCharValue * Math.pow(SCALE, str.length() - i - 1));
        }
        return value;
    }
}

乱序

如果你不想让别人轻易的推断出你62进制转换后的字符串和10进制数字的对应关系,可以把上面代码中的CHARS变量中的字符串顺序打乱,这样的话猜出映射关系的难度会提升很多。

版权声明:《java实现62进制和10进制转换算法》为CoderBBB作者「ʘᴗʘ」的原创文章,转载请附上原文出处链接及本声明。

原文链接:https://www.coderbbb.com/articles/24

其它推荐:

user

ʘᴗʘ

77
文章数
52605
浏览量
41988
获赞数
67.80
总收入