4

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

有人可以为我指出正确的方向,这是否是一个足够好的主意?如果我想将名称保留在一定数量的字符下,是否可以使用其他解决方案?

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

4

4 回答 4

13

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

 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 种可能的组合)。

于 2009-05-01T17:35:52.697 回答
9

System.IO.Path.GetRandomFileName()

于 2009-05-01T17:19:31.503 回答
3

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

于 2009-05-01T17:18:26.077 回答
1

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

使用 Oracle,您将创建一个序列,如下所示;

CREATE SEQUENCE sequence_name MINVALUE 值 MAXVALUE 值 START WITH value INCREMENT BY value CACHE 值;

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

创建序列 seq_user_id;

从双重选择 seq_user_id.NEXTVAL;

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

于 2009-05-01T17:33:34.980 回答