using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Diagnostics;
private static readonly Regex Base64Regex = new(@"^[a-zA-Z0-9\+/]*={0,3}$", RegexOptions.Compiled);
private static Random random = new Random();
public static void Main()
var strings = new List<string>();
for(var i = 0; i < 500_000; i++)
var size = random.Next(5, 50);
var str = RandomString(size);
if (random.Next(10) >= 5)
str = EncodeToBase64(str);
Stopwatch stopwatch = new Stopwatch();
var notBase64Strings = 0;
for (var i = 0; i < strings.Count; i++)
if (isBase64StringPrefiltered(strings[i]))
Console.WriteLine("Prefiltered Results: " + (stopwatch.ElapsedMilliseconds / 1_000.0) + " seconds elapsed.\n" + base64Strings + " base64 strings " + notBase64Strings + " non-base64 strings" );
for (var i = 0; i < strings.Count; i++)
if (isBase64StringUnfiltered(strings[i]))
Console.WriteLine("Unfiltered Results: " + (stopwatch.ElapsedMilliseconds / 1_000.0) + " seconds elapsed.\n" + base64Strings + " base64 strings " + notBase64Strings + " non-base64 strings" );
private static string RandomString(int length)
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ";
return new string(Enumerable.Range(1, length).Select(_ => chars[random.Next(chars.Length)]).ToArray());
private static bool isBase64StringPrefiltered(string input)
return !(string.IsNullOrWhiteSpace(input)
|| !Base64Regex.IsMatch(input));
private static bool isBase64StringUnfiltered(string input)
return input.Length % 4 == 0 && Base64Regex.IsMatch(input);
private static string EncodeToBase64(string input)
return Convert.ToBase64String(Encoding.UTF8.GetBytes(input));