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

作者: ʘᴗʘ发布时间:2021-10-26 20:05 浏览量:1012 点赞:744 售价: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

其它推荐:

  • Vditor粘贴、上传图片到阿里云OSS(WEB直传方式)

    当我们在Vditor中粘贴站外图片或直接上传本地图片的时候,我们希望图片直接上传到阿里云OSS上,不经过我们的业务服务器转发,这样可以有效降低业务服务器的带宽占用,同时还能提高图片的上传速度。本文介绍了如何配置Vditor,让其可以完美直传图片到阿里云OSS中。

  • springboot整合mybatis查询mysql数据库教程

    本文介绍如何在springboot中整合mybatis来查询mysql数据库,包括各种join查询、主键自动生成、复杂resultMap映射、in查询等,通过阅读本文可以掌握springboot+mybatis的常用各种语法。

  • Springboot整合Redis和redis常用操作演示

    本文介绍如何在springboot中引入redis数据库,并执行各类redis操作。过程非常简单,只要引入一些jar包,并配置redis连接信息即可。

  • springboot3+EhCache3缓存+JDK17整合指南

    本文介绍了如何在springboot3中整合使用EhCache3作为缓存。和EhCache2相比,EhCache3的整合方法完全不同。同时,由于在springboot3中删除了EhCacheCacheManager类,也让整合方法完全不同。参考本文,可以快速完成整合。

  • Springboot配置PC端和移动端使用不同模板(多皮肤换肤思路也差不多)

    日常开发中,一个网页往往需要同时适配PC端和移动端。简单的页面我们可以使用CSS来完成自适应,但比较复杂的页面可能需要给PC端和移动端分别开发不同的模板。那么Springboot如何能根据访问的终端特点(User-Agent)来自动使用对应的模板呢?

  • java使用Gzip压缩Json字符串

    本文提供了一个使用java内置的Gzip算法压缩字符串(比如JSON)的压缩、解压缩类,使用本文的代码可以方便的压缩将JSON的体积压缩一半以上。

  • 【性能提升100倍】springboot+thymeleaf缓存html网页提高并发性能

    本文介绍了springboot+thymeleaf技术栈下生成HTML页面缓存的方法,将整个HTML网页缓存在内存、硬盘中,极大的提升了Springboot开发的web网站的并发性能,实测性能提升100倍以上。

  • Java Springboot使用OkHttp实现微信支付API-V3签名、证书的管理和使用

    新版的微信支付API-V3中,最让人头疼的就是各种安全措施。各种凌乱的概念让人摸不着头脑。比如微信平台证书、商户证书、API KEY等等概念。本文从零开始,引导读者一步一步实现了整个微信支付的安全验证,通过本文可以快速完成微信支付的安全开发。

  • Springboot+thymeleaf结合Vue,通过thymeleaf给vue赋值解决Vue的SEO问题

    vue开发的项目有时候会有SEO的需求,由于vue是JavaScript框架,内容都在JavaScript和服务端,所以SEO效果很差。本文介绍一种通过springboot+thymeleaf这样传统的前后端分离方案,再整合vue,从而在兼顾vue开发便利性的同时,获得不错的SEO效果。

  • springboot整合thymeleaf完成第一个HTML网页

    在当前的HTML网页开发中,虽然Vue、React等框架非常流行,但是因为部分行业、网站对搜索引擎SEO的需求,传统的模板引擎仍有一席之地。本文继续使用上文生成的Demo工程,通过引入thymeleaf来完成我们的第一个网页。

user

ʘᴗʘ

77
文章数
72662
浏览量
57089
获赞数
67.80
总收入