如何将字符串转换为“;唯一密钥”;在c#中

本文关键字:密钥 唯一 字符串 转换 | 更新日期: 2023-09-27 18:21:10

我需要一个函数,它可以提供从一个字符串到另一个字符串的一对一映射,但输出字符串具有作为文件正确名称的良好特性。

更具体地说,我的问题是,给定图像的URL,我想用给定该URL的唯一名称保存图像。我需要一个类似的代码

string url;
string uniqueName = UrlToName (url);
string fileName = path + uniqueName + ".png";

问题是如何获得UrlToName函数。一个可能的解决方案可能是GetHashCode,但我不知道它是否正确。

如何将字符串转换为“;唯一密钥”;在c#中

最好使用数据库-为每个文件创建一个新行,将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,否则你每次都会得到一个唯一的字符串。