发布时间:2026-09-28 16:50:01 浏览次数:1
下面是C#网址压缩简单实现短网址的完整攻略:
短网址是将长的url经过特殊算法处理,缩短成几个字符,方便用户记忆、分享、输入等。短网址生成的过程包含以下几个步骤:
常用的短网址算法有以下几种:
其中,哈希算法是较为常用的一种。哈希算法是指将长网址通过一种哈希函数映射为短字符串,一般是通过对长网址进行MD5/SHA1等加密运算,然后再进行字符串截取、替换等处理,最终得到短字符串。
基于上述算法原理,可以将C#短网址实现分为以下几个步骤:
其中,在实现短字符串的生成时,可以考虑使用自增序列算法、随机字符串等方法。
下面分别给出两条示例,具体实现稍有不同,但基本上都是按照以上思路和步骤来进行的。
//定义自增序列private static int ShortUrlSeed = 10000;private static readonly object ShortUrlLocker = new object();//生成短字符串的方法public static string GenerateShortUrl(string url){ //判断url是否已经存在,如果存在,则直接返回短字符串 var short = QueryShortUrl(url); if (!string.IsNullOrEmpty(short)) { return short; } //加锁,保证自增序列生成唯一短字符串 lock (ShortUrlLocker) { //生成短字符串 var shortUrl = "http://short.com/" + ShortUrlSeed.ToString("x8"); ShortUrlSeed++; //将url与生成的短字符串存储到数据库 AddShortUrl(url, shortUrl); //返回短字符串 return shortUrl; }}//添加数据操作public static void AddShortUrl(string url, string shortUrl){ using (var conn = new SqlConnection(ConnectionString)) { var sqlStr = "INSERT INTO [ShortUrls] ([url], [shortUrl]) VALUES (@url, @shortUrl)"; var cmd = new SqlCommand(sqlStr, conn); cmd.Parameters.AddWithValue("url", url); cmd.Parameters.AddWithValue("shortUrl", shortUrl); conn.Open(); cmd.ExecuteNonQuery(); }}//查询数据操作public static string QueryShortUrl(string url){ using (var conn = new SqlConnection(ConnectionString)) { var sqlStr = "SELECT [shortUrl] FROM [ShortUrls] WHERE [url] = @url"; var cmd = new SqlCommand(sqlStr, conn); cmd.Parameters.AddWithValue("url", url); conn.Open(); var obj = cmd.ExecuteScalar(); if (obj != null) { return obj.ToString(); } else { return ""; } }}//生成短字符串的方法public static string GenerateShortUrl(string url){ //判断url是否已经存在,如果存在,则直接返回短字符串 var shortUrl = QueryShortUrl(url); if (!string.IsNullOrEmpty(shortUrl)) { return shortUrl; } //生成随机字符串 var short = GenerateRandomString(6); //判断随机字符串是否已经存在,如果存在,则重新生成 while (!IsValidShortString(short)) { short = GenerateRandomString(6); } //生成短字符串 var shortUrl = $"http://short.com/{short}"; //将url与生成的短字符串存储到数据库 AddShortUrl(url, shortUrl); //返回短字符串 return shortUrl;}//添加数据操作public static void AddShortUrl(string url, string shortUrl){ using (var conn = new SqlConnection(ConnectionString)) { var sqlStr = "INSERT INTO [ShortUrls] ([url], [shortUrl]) VALUES (@url, @shortUrl)"; var cmd = new SqlCommand(sqlStr, conn); cmd.Parameters.AddWithValue("url", url); cmd.Parameters.AddWithValue("shortUrl", shortUrl); conn.Open(); cmd.ExecuteNonQuery(); }}//查询数据操作public static string QueryShortUrl(string url){ using (var conn = new SqlConnection(ConnectionString)) { var sqlStr = "SELECT [shortUrl] FROM [ShortUrls] WHERE [url] = @url"; var cmd = new SqlCommand(sqlStr, conn); cmd.Parameters.AddWithValue("url", url); conn.Open(); var obj = cmd.ExecuteScalar(); if (obj != null) { return obj.ToString(); } else { return ""; } }}//生成随机字符串的方法private static readonly string Chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";public static string GenerateRandomString(int length){ var sb = new StringBuilder(length); var random = new Random(); for (var i = 0; i < length; i++) { sb.Append(Chars[random.Next(Chars.Length)]); } return sb.ToString();}//判断随机字符串是否已经存在的方法public static bool IsValidShortString(string shortUrl){ var query = $"SELECT COUNT(*) FROM [ShortUrls] WHERE [shortUrl] = '{shortUrl}'"; using (var conn = new SqlConnection(ConnectionString)) { var cmd = new SqlCommand(query, conn); conn.Open(); var count = (int)cmd.ExecuteScalar(); return count == 0; }}