首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

C# 產生驗證碼 (英數混合) 高效能隨機演算法改良版

     編輯:ASP.NET 基礎

原始低效寫法

早期使用 `Random.Next() % array.Length` 配合字串陣列 `Substring`,字串串聯在迴圈中效能極差。

改良版:StringBuilder + 字元陣列


public static string GenerateCaptcha(int length = 6)
{
    const string chars = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ"; // 排除易混淆 0/O 1/I
    var random = new Random((int)DateTime.Now.Ticks);
    var sb = new StringBuilder(length);

    for (int i = 0; i < length; i++)
    {
        sb.Append(chars[random.Next(chars.Length)]);
    }
    return sb.ToString();
}

關鍵優化點

原寫法改良版
`text2 = text2 + ...` 字串不可變,產生大量暫時物件`StringBuilder` 可變緩衝區,單次配置
`Substring(random.Next() % len, 1)` 兩次運算、建立子字串`chars[random.Next(chars.Length)]` 直接索引字元
字串常數 `textArray` 每次迴圈存取`const string chars` 編譯期內嵌,唯讀

進階:密碼學安全隨機數


using System.Security.Cryptography;

public static string GenerateSecureCaptcha(int length = 6)
{
    const string chars = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
    using (var rng = RandomNumberGenerator.Create())
    {
        var bytes = new byte[length];
        rng.GetBytes(bytes);
        var sb = new StringBuilder(length);
        foreach (byte b in bytes)
            sb.Append(chars[b % chars.Length]);
        return sb.ToString();
    }
}
  • `RandomNumberGenerator` (CSP) 產生密碼學強度亂數,適合高安全性驗證碼。
  • 效能較 `Random` 稍低,但可接受。

效能測試參考 (100 萬次)

StringBuilder + Random      : ~180 ms
StringBuilder + RNGCryptoSP : ~420 ms
舊版 Substring 串聯       : ~2,300 ms
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved