Random random = SecureRandom.getInstanceStrong();堵塞线程问题解决

文章讲述了在遵循Sonar的建议,将Random替换为SecureRandom.getInstanceStrong()后,代码在Windows环境下运行正常,但在Linux环境中出现性能问题,导致接口无响应。作者通过逐步调试发现这一问题,并最终选择使用Math.random()方法来解决这个问题,强调技术推荐需结合业务场景谨慎使用。

在这里插入图片描述

sonar扫描到使用Random随机函数不安全, 推荐使用SecureRandom替换,就是他–》【SecureRandom.getInstanceStrong()】,分别在本地,测试环境测过没问题上生产,但是运行了一段时间突然报错!!!

然后还是像那个博主一样,一段一段代码的注释上测试环境才发现问题在哪里,坑就坑在这,在win10环境正常得很,一到linux上面就和个发病的一样生成随机数字卡顿,导致接口请求无响应

最后还是换了个实现方式,sonar扫描后也没问题结尾

sonar推荐的不一定都是适合自己业务场景,只是站在了技术层面考虑,推荐的东西自己还是要慎用!!

有问题的代码:

Random random = SecureRandom.getInstanceStrong();
//把随机生成的数字转成字符串
String code = String.valueOf(random.nextInt(9)
你提供的代码: ```java SecureRandom secureRandom = new SecureRandom(); int randomNumber = 1000 + secureRandom.nextInt(9999 - 1000); ``` 我们来**逐行分析、纠正并优化它**。 --- ### ✅ 正确性分析 #### 原始代码: ```java int randomNumber = 1000 + secureRandom.nextInt(9999 - 1000); ``` 先计算范围: `9999 - 1000 = 8999` 所以这等价于: ```java secureRandom.nextInt(8999) // 返回 [0, 8998] ``` 然后加上 `1000` → 得到 `[1000, 9998]` ❌ **问题来了:最大值是 9998,永远取不到 9999!** 而你想要的是一个 **4 位数随机数**,即范围应为 `[1000, 9999]`(包含 9999),共 9000 个可能值。 --- ### ✅ 正确写法 你应该使用: ```java int randomNumber = 1000 + secureRandom.nextInt(9000); // 9000 = 9999 - 1000 + 1 ``` ✅ 这样: - `secureRandom.nextInt(9000)` → 生成 `[0, 8999]` - 加上 `1000` → `[1000, 9999]` - 完全覆盖所有四位数! --- ### ✅ 完整正确示例 ```java import java.security.SecureRandom; public class SecureFourDigitGenerator { private static final SecureRandom secureRandom = new SecureRandom(); public static int generateFourDigit() { return 1000 + secureRandom.nextInt(9000); } public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println(generateFourDigit()); } } } ``` 输出示例(每次运行不同): ``` 5672 1039 9845 ... ``` --- ### 🔍 关键点总结 | 表达式 | 含义 | 是否正确 | |-------|------|---------| | `secureRandom.nextInt(n)` | 生成 `[0, n)` 的整数(左闭右开) | ✅ | | `1000 + nextInt(8999)` | → `[1000, 9998]` | ❌ 缺少 9999 | | `1000 + nextInt(9000)` | → `[1000, 9999]` | ✅ 正确 | > 📌 公式:要生成 `[min, max]` 范围内的随机整数: > > ```java > int random = min + secureRandom.nextInt(max - min + 1); > ``` 应用到这里就是: ```java int random = 1000 + secureRandom.nextInt(9999 - 1000 + 1); // 即 +9000 ``` --- ### 💡 拓展:生成固定长度字符串形式的验证码(如 "0012") 如果你希望保留前导零(比如生成 `"0001"` 到 `"9999"` 的字符串格式),可以用: ```java String code = String.format("%04d", generateFourDigit()); ``` 或者直接生成 0000~9999 的字符串: ```java public static String generateFourDigitString() { return String.format("%04d", secureRandom.nextInt(10000)); } ``` 输出示例:`"0001"`, `"1234"`, `"9999"` --- ### ✅ 最佳实践建议 1. **复用 `SecureRandom` 实例**:不要频繁新建,它是线程安全的。 2. **避免硬编码数字**:使用常量提高可读性。 ```java private static final int MIN = 1000; private static final int MAX = 9999; private static final int RANGE = MAX - MIN + 1; public static int generateValidCode() { return MIN + secureRandom.nextInt(RANGE); } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值