UUID转25位SN

分享一个自己写的UUID转25位SN编码的算法

需求

需要生成用户输入的SN编码,该编码需要满足3个特征:

1)唯一编码,不重复

2)为了方便输入,仅包含大写和数字,避免出现混淆的字符,例如0和O,8和B

3)尽可能的短小

方案

1)满足条件1的方案,可以考虑采用UUID编码

2)混淆的字符,可以考虑采用字典编码的方式,将混淆的字符从字典里剔除

3)尽可能的短小,我们可以将其它字符考虑进来,这样增加G-Z字符并能压缩长度

实现 

我们建立一个5bit的的字典,共32个字符,用于压缩信息信息,这样每个字符可以多处理1bit,我们只需要把重新划分即可。我们建立这个32字符字典,把0和O,8和B这两个容易弄混的数字干掉:

12345679ACDEFGHIJKLMNPQRSTUVWXYZ

然后重新按bit映射实现信息压缩,将4位一组的信息重新划分,并在字典里找到映射信息,如下图:

这样每5个字符我们就可以压缩1字符。但是由于4*32%5=3,该3位为UUID的随机位,考虑不参与计算。当然也可以添加进来,形成26位SN,下面是25位SN的算法:
 

import java.util.UUID;

import org.apache.commons.lang3.RegExUtils;

/**
 * @author Jim
 */

public class UUIDUtil {
	private static final char[] SN_CHAR_DICT = "12345679ACDEFGHIJKLMNPQRSTUVWXYZ".toCharArray(); //5位SN字典,把0和O,8和B这两个容易弄混的数字干掉

	/**
	 * 使用字典将UUID转25位SN
	 * @return
	 */
	public static String randomSN() {
		String uuidStr = RegExUtils.replaceAll(UUID.randomUUID().toString(), "-", "");
		StringBuilder binBuilder = new StringBuilder();
		for(byte numbyte: uuidStr.getBytes()) {
			String binStr = Integer.toString(numbyte, 2);
			binBuilder.append(("0000" + binStr).substring(binStr.length()));
		}
		StringBuilder snBuilder = new StringBuilder();
		for(int i = 0; i < 25; i ++) {
			snBuilder.append(SN_CHAR_DICT[Integer.parseInt(binBuilder.substring(i*5, i*5+5), 2)]);
		}//最后3位丢弃,形成25位SN
		return snBuilder.toString();
	}

}

该算法适合手输或印刷SN编码。如果要采用URL来传递参数,也可以采用同样的算法,大小写相关字符将UUID压缩到22位,有兴趣的可以自己试试

相关推荐

  1. 深入理解汇编中的ZF、OF、SF标志和条件跳

    2024-04-25 03:26:02       35 阅读
  2. js基础语法大全(时间戳,uuid,字符串json)

    2024-04-25 03:26:02       43 阅读
  3. 封装UUID

    2024-04-25 03:26:02       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-25 03:26:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-25 03:26:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-25 03:26:02       82 阅读
  4. Python语言-面向对象

    2024-04-25 03:26:02       91 阅读

热门阅读

  1. InfluxDB v1.8

    2024-04-25 03:26:02       37 阅读
  2. 2024 极术通讯-生成式AI的发展现状与未来趋势

    2024-04-25 03:26:02       35 阅读
  3. 数据结构与算法-砖墙问题

    2024-04-25 03:26:02       37 阅读
  4. vivado 通过修改调试核 (ILA) 来进行增量编译

    2024-04-25 03:26:02       32 阅读
  5. UE5 android package

    2024-04-25 03:26:02       35 阅读
  6. Python_偏函数

    2024-04-25 03:26:02       33 阅读