HashSet适用于存储不重复随机验证码,核心流程为生成随机字符串→检查是否存在→不存在则添加;字符集排除易混字符,长度4–6位,用Random或ThreadLocalRandom生成,validateAndConsume方法实现一次性校验与删除。

用 HashSet 存储不重复的随机验证码,核心是:**生成随机字符串 → 检查是否已存在 → 不存在则添加**。由于 HashSet 自动去重且查找快(平均 O(1)),它非常适合这类场景。
生成固定长度的随机验证码
验证码通常由数字和大写字母组成(避免混淆如 0/O、1/l),长度常见为 4–6 位。可用 Random 或 ThreadLocalRandom 配合字符数组生成:
private static final String CHARSET = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ"; // 排除易混字符
private static final int CODE_LENGTH = 4;
private static final Random RANDOM = new Random();
public static String generateCode() {
StringBuilder sb = new StringBuilder(CODE_LENGTH);
for (int i = 0; i < CODE_LENGTH; i++) {
sb.append(CHARSET.charAt(RANDOM.nextInt(CHARSET.length())));
}
return sb.toString();
}
用 HashSet 管理验证码集合
声明一个线程安全或受控访问的 HashSet(注意:HashSet 本身不是线程安全的,多线程下需额外保护):
- 单线程/简单场景:直接用
new HashSet<>() - 多线程环境(如 Web 应用生成验证码):用
Collections.synchronizedSet(new HashSet<>()),或改用ConcurrentHashMap.newKeySet()(Java 8+,更推荐)
示例(线程安全写法):
立即学习“Java免费学习笔记(深入)”;
Set<String> codeSet = ConcurrentHashMap.newKeySet(); // 线程安全,性能好
// 添加不重复验证码
String code;
do {
code = generateCode();
} while (!codeSet.add(code)); // add() 返回 true 表示新增成功,false 表示已存在
控制数量与过期清理(实用建议)
HashSet 只保证不重复,但不自动清理旧码。实际应用中需考虑:
-
限制总数:防止内存无限增长,比如最多存 1000 个,超出时可清除最早生成的(需配合
LinkedHashSet或额外队列) -
带过期时间:单纯
HashSet不支持 TTL。如需自动过期,建议改用Caffeine或Guava Cache,设置 expireAfterWrite -
校验后及时移除:用户输入验证码后,调用
codeSet.remove(input),避免重复使用
完整轻量示例(无第三方依赖)
适合测试或简单后台:
import java.util.concurrent.ConcurrentHashMap;
import java.util.Set;
public class CodeManager {
private static final Set<String> VALID_CODES = ConcurrentHashMap.newKeySet();
private static final int MAX_CODES = 500;
public static String issueNewCode() {
String code;
do {
code = generateCode();
} while (!VALID_CODES.add(code));
// 可选:超限时随机清理(简单策略)
if (VALID_CODES.size() > MAX_CODES) {
VALID_CODES.remove(VALID_CODES.iterator().next()); // 移除一个(不保证最老)
}
return code;
}
public static boolean validateAndConsume(String input) {
return VALID_CODES.remove(input); // 移除即校验,一次有效
}
}
不复杂但容易忽略细节:字符集避坑、线程安全、用完即删、及时清理。按需组合即可稳定支撑验证码去重需求。


















