我想在我的网站上创建随机文件夹名称来存储图像及其缩略图,但是我没有使用生成的guid的完整版本,而是考虑使用它的一部分,也许只是前8个字符和可能base64对它进行编码。我担心可能的碰撞。

有人能否指出我是否是一个好主意?如果我想将名称保留在一定数量的字符下,是否有可以使用的替代解决方案?

UPDATE :我试图远离path.GetRandomFileName,因为它使用的是原始guid,而且它不是12个字符长...

有帮助吗?

解决方案

为什么不直接使用这样的东西,然后循环,直到你可以创建没有冲突的文件?

 const string ValidChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

 static string GenerateName(Random random, int length)
 {
     char[] chars = new char[length];
     for (int i=0; i < length; i++)
     {
         chars[i] = ValidChars[random.Next(ValidChars.Length)];
     }
     return new string(chars);
 }

传递RNG的原因是为了避免在不使用静态RNG(非线程安全)的情况下在方法中创建新RNG(在快速连续调用时重复)的典型问题。

另一种方法是拥有一个静态只读RNG,并通过锁定序列化 GenerateName 中的调用。

重点是以某种方式你生成一个随机名称,你只是继续尝试创建具有随机名称的文件,直到你成功,这很可能很快发生(12个字符[AZ 0] -9]给出4,738,381,338,321,616,896种可能的组合。)

其他提示

System.IO.Path.GetRandomFileName()

您可以使用System.IO中的Path类来生成随机文件和文件夹名称。

如果您正在为您的网站使用数据库,那么您可以使用自动递增数字或序列为图像生成唯一的文件名。

使用Oracle,您可以按如下方式创建序列;

CREATE SEQUENCE sequence_name     MINVALUE值     MAXVALUE值     START WITH value     递增价值     CACHE值;

要获取序列中的下一个值,请使用序列的nextval。例如

创建序列seq_user_id;

SELECT seq_user_id.NEXTVAL FROM dual;

INSERT INTO test_bed(user_id,class_type,room_location) 价值(seq_user_id.NEXTVAL,'Underwater Basketweaving','RM1205');

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top