如何将字符串转换为“;唯一密钥”;在c#中
本文关键字:密钥 唯一 字符串 转换 | 更新日期: 2023-09-27 18:21:10
我需要一个函数,它可以提供从一个字符串到另一个字符串的一对一映射,但输出字符串具有作为文件正确名称的良好特性。
更具体地说,我的问题是,给定图像的URL,我想用给定该URL的唯一名称保存图像。我需要一个类似的代码
string url;
string uniqueName = UrlToName (url);
string fileName = path + uniqueName + ".png";
问题是如何获得UrlToName
函数。一个可能的解决方案可能是GetHashCode
,但我不知道它是否正确。
最好使用数据库-为每个文件创建一个新行,将Uri存储在一列中,将生成的文件名存储在另一列中(例如Guid.NewGuid().ToString()+".png")。
这不受文件名长度(NTFS中约255个字符,而URL可能约为2000)的任何问题的影响,不存在哈希冲突的可能性,而且随着数据库的增长,您可以随着时间的推移改进存储算法,例如,添加目录,这样您就不会在一个目录中出现太多文件(这使得它在资源管理器中不可用)。
如果您曾经基于外部输入在服务器上创建文件名,那么您还应该关注安全风险。这个答案中的大部分建议也适用于此。
试试这样的东西:
private string UrlToName(string url)
{
foreach (char c in System.IO.Path.GetInvalidFileNameChars())
{
url = url.Replace(c, '_');
}
return url;
}
这将确保它具有有效的文件名字符。只要传入的url是唯一的,那么这个函数应该总是返回一个唯一的字符串。
如果您确实需要一个真正唯一的名称,即使传入了相同的URL,也可以尝试以下操作:
private string UrlToName(string url)
{
url = url + "_" + DateTime.Now.ToString("o");
foreach (char c in System.IO.Path.GetInvalidFileNameChars())
{
url = url.Replace(c, '_');
}
return url;
}
这将添加一个日期戳,一直到字符串末尾的毫秒。除非你在同一毫秒内(极不可能)传递完全相同的URL,否则你每次都会得到一个唯一的字符串。