如何确保每次调用GenerateCode函数生成唯一随机字符串?
修复随机唯一兑换码生成的问题
你的代码存在几个关键问题,导致无法保证每次生成不重复的字符串:
- 判断逻辑无效:
Giftcodes.Keys == null永远不会成立——Dictionary的Keys属性哪怕在字典为空时,也会返回一个空集合而非null,所以这个分支永远不会执行。 - 循环条件完全颠倒:
while (!Giftcodes.Keys.Contains(code))的逻辑是「当code不在字典里时持续循环」,这会导致生成有效code后反而不断重复生成新值,完全违背了「生成唯一code」的需求。正确逻辑应该是「当code已存在时,继续生成新的」。 - 未记录已生成的code:生成新code后没有存入
Giftcodes字典,导致后续调用无法校验历史生成记录,必然会出现重复。
修复后的代码
public static Dictionary<string, long> Giftcodes = new Dictionary<string, long>(); // 静态Random实例,避免短时间多次调用导致的重复 private static Random random = new Random(); public static string GenerateCode() { string chars = "abcefhijkmnorsuvwxyzABCDEFHIKMNORSUVWXYZ1234567890"; string code; // 循环生成code,直到得到一个未在字典中出现过的值 do { code = new string(Enumerable.Repeat(chars, 16) .Select(s => s[random.Next(s.Length)]).ToArray()); } while (Giftcodes.ContainsKey(code)); // 将生成的code存入字典(可根据业务需求替换对应的long值) Giftcodes.Add(code, 0); return code; }
关键修改说明
- 移除了无用的
Giftcodes.Keys == null判断,直接进入核心生成逻辑。 - 改用
do-while循环,先生成code再校验是否重复,确保只有未存在的code才会被返回。 - 生成有效code后立即存入字典,确保后续生成时能校验重复记录。
如果是在多线程环境下调用该方法,需要添加锁保证线程安全,示例如下:
private static readonly object _lockObj = new object(); public static string GenerateCode() { string chars = "abcefhijkmnorsuvwxyzABCDEFHIKMNORSUVWXYZ1234567890"; string code; lock (_lockObj) { do { code = new string(Enumerable.Repeat(chars, 16) .Select(s => s[random.Next(s.Length)]).ToArray()); } while (Giftcodes.ContainsKey(code)); Giftcodes.Add(code, 0); } return code; }
内容的提问来源于stack exchange,提问作者Security Support
相关产品推荐
相关产品推荐

