如何用Java的SecureRandom生成16位随机字母数字串?代码偶生15位串
解决SecureRandom生成十六进制串长度不一致的问题
这是个很常见的小坑,我来给你拆解下原因和解决方案:
问题根源
你生成的是64位的随机BigInteger,转换成十六进制时,理论上应该对应16个字符(因为每4位二进制=1位十六进制)。但BigInteger的toString(16)方法会自动省略前导零——如果随机生成的64位数值最高4位全是0,转成十六进制就会少一位,变成15个字符。
解决方案:补全前导零
只需要在返回结果时,强制把字符串补全到固定的16位,用前导零填充即可。这里给你两种常用实现方式:
方式一:用Java原生的String.format
不需要额外依赖,直接用格式化语法补零:
import java.math.BigInteger; import java.security.SecureRandom; public class GenerateSecureRandom { private static SecureRandom SECURE_RANDOM = new SecureRandom(); public static String nextSessionId() { BigInteger randomNum = new BigInteger(64, SECURE_RANDOM); // %016x 表示以十六进制输出,不足16位时用前导零补全 return String.format("%016x", randomNum); } }
方式二:用Apache Commons Lang的工具类
如果你的项目已经依赖了Apache Commons Lang,可以用更直观的leftPad方法:
import java.math.BigInteger; import java.security.SecureRandom; import org.apache.commons.lang3.StringUtils; public class GenerateSecureRandom { private static SecureRandom SECURE_RANDOM = new SecureRandom(); public static String nextSessionId() { String hexStr = new BigInteger(64, SECURE_RANDOM).toString(16); // 把字符串左填充到16位,不足的用'0'补全 return StringUtils.leftPad(hexStr, 16, '0'); } }
两种方式都能保证生成的字符串始终是16位的字母数字串,再也不会出现长度不一致的情况啦。
内容的提问来源于stack exchange,提问作者Joel
相关产品推荐
相关产品推荐

