Java编程:10进制数、62进制数进行相互转换

本文介绍了一种将10进制数字转换为62进制字符串的方法,该方法可用于生成不易推测的唯一用户名。通过使用62个字符(包括数字和字母),可以将任意长的10进制数字转换为固定长度的62进制字符串,反之亦然。此技术有助于确保用户名的唯一性和随机性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景:要求随机生成长度较短的用户名,保证用户名唯一,同时保证用户名不易被推测出。
解决思路:按序生成唯一序列号,通过算法将序列号进行混淆,之后将其转化为 62 进制的 11 位字符串。通过以上的策略可以保证生成的用户名唯一,通过混淆算法使用户名不易被推测出,并且最大可以支持 2^62 - 1 个用户名。
以下代码是将10进制、62进制互转的方法,后续会写一篇关于混淆算法的文章。文章仅代表个人观点,如有不正之处,欢迎批评指正。

package org.learn.id;

import org.apache.commons.lang.StringUtils;

/**
 * 10进制、62进制互转
 * edited by zhibo on 2015/05/21.
 */
public class ConversionUtil {
    /**
     * 初始化 62 进制数据,索引位置代表字符的数值,比如 A代表10,z代表61等
     */
    private static String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    private static int scale = 62;

    /**
     * 将数字转为62进制
     *
     * @param num    Long 型数字
     * @param length 转换后的字符串长度,不足则左侧补0
     * @return 62进制字符串
     */
    public static String encode(long num, int length) {
        StringBuilder sb = new StringBuilder();
        int remainder = 0;

        while (num > scale - 1) {
            /**
             * 对 scale 进行求余,然后将余数追加至 sb 中,由于是从末位开始追加的,因此最后需要反转(reverse)字符串
             */
            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();
        return StringUtils.leftPad(value, length, '0');
    }

    /**
     * 62进制字符串转为数字
     *
     * @param str 编码后的62进制字符串
     * @return 解码后的 10 进制字符串
     */
    public static long decode(String str) {
        /**
         * 将 0 开头的字符串进行替换
         */
        str = str.replace("^0*", "");
        long num = 0;
        int index = 0;
        for (int i = 0; i < str.length(); i++) {
            /**
             * 查找字符的索引位置
             */
            index = chars.indexOf(str.charAt(i));
            /**
             * 索引位置代表字符的数值
             */
            num += (long) (index * (Math.pow(scale, str.length() - i - 1)));
        }

        return num;
    }


    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("62进制:" + encode(2576460752303423487L, 11));
        System.out.println("10进制:" + decode("34KDUNMZwuV"));
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值