如何在c#中将字符串转换为“唯一键”?

时间:2014-09-08 02:47:01

标签: c# hash uniqueidentifier

我需要一个函数,它提供从字符串到另一个字符串的一对一映射,但输出字符串是一个文件的正确名称的nice属性。

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

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

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

2 个答案:

答案 0 :(得分:2)

最好的办法是使用数据库 - 为每个文件创建一个新行,将Uri存储在一列中,将生成的文件名存储在另一列中(例如Guid.NewGuid()。ToString()+" .PNG"。)

这不受文件名长度的任何问题的影响(NTFS中约为255个字符,而URL可能为~2000),不存在哈希冲突的可能性,随着数据库的增长,您可以随着时间的推移改进存储算法,例如,添加目录以便在单个目录中不会出现太多文件(这使得它在资源管理器中无法使用)。

如果您根据外部输入在服务器上创建文件名,则还应该关注安全风险。 this answer中的大部分建议也适用于此。

答案 1 :(得分:0)

尝试这样的事情:

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,同样精确到毫秒(极不可能),否则每次都会得到一个唯一的字符串。