diff --git a/Core/Utils/HashUtil.cs b/Core/Utils/HashUtil.cs new file mode 100644 index 00000000..b00a3e3f --- /dev/null +++ b/Core/Utils/HashUtil.cs @@ -0,0 +1,90 @@ +using System.Text; +using System.Text.RegularExpressions; +using System.Security.Cryptography; + +namespace Types.Utils; + +public static partial class HashUtil +{ + /// + /// Create a 24 character id using the sha256 algorithm + current timestamp + /// + /// 24 character hash + public static string Generate() + { + throw new NotImplementedException(); + } + + /// + /// is the passed in string a valid mongo id + /// + /// String to check + /// True when string is a valid mongo id + public static bool IsValidMongoId(string stringToCheck) + { + return MongoIdRegex().IsMatch(stringToCheck); + } + + public static string GenerateMd5ForData(string data) + { + return GenerateHashForData(HashingAlgorithm.MD5, data); + } + + public static string GenerateSha1ForData(string data) + { + return GenerateHashForData(HashingAlgorithm.SHA1, data); + } + + public static string GenerateCrc32ForData(string data) + { + // TODO: Could not find a ms way of doing this. + // May need a custom impl to avoid an external lib. - CJ + throw new NotImplementedException(); + } + + /// + /// Create a hash for the data parameter + /// + /// algorithm to use to hash + /// data to be hashed + /// hash value + /// thrown if the provided algorithm is not implemented> + public static string GenerateHashForData(HashingAlgorithm algorithm, string data) + { + switch (algorithm) + { + case HashingAlgorithm.MD5: + var md5HashData = MD5.HashData(Encoding.UTF8.GetBytes(data)); + return Convert.ToHexString(md5HashData).Replace("-", string.Empty); + + case HashingAlgorithm.SHA1: + var sha1HashData = SHA1.HashData(Encoding.UTF8.GetBytes(data)); + return Convert.ToHexString(sha1HashData).Replace("-", string.Empty); + } + + throw new NotImplementedException("Provided hash algorithm is not supported."); + } + + /// + /// Generates an account ID for a profile + /// + /// Generated account ID + public static int GenerateAccountId() + { + const int min = 1000000; + const int max = 1999999; + + var random = new Random(); + + return random.Next() * (max - min + 1) + min; + } + + [GeneratedRegex("^[a-fA-F0-9]{24}$", RegexOptions.IgnoreCase, "en")] + private static partial Regex MongoIdRegex(); +} + +public enum HashingAlgorithm +{ + MD5, + SHA1, +} \ No newline at end of file