我想在我的网站上创建随机文件夹名称来存储图像及其缩略图,但是我没有使用生成的guid的完整版本,而是考虑使用它的一部分,也许只是前8个字符和可能base64对它进行编码。我担心可能的碰撞。
有人能否指出我是否是一个好主意?如果我想将名称保留在一定数量的字符下,是否有可以使用的替代解决方案?
UPDATE :我试图远离path.GetRandomFileName,因为它使用的是原始guid,而且它不是12个字符长...
答案 0 :(得分: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种可能的组合。)
答案 1 :(得分:9)
System.IO.Path.GetRandomFileName()
答案 2 :(得分:3)
您可以使用System.IO中的Path类来生成随机文件和文件夹名称。
答案 3 :(得分:1)
如果您正在为您的网站使用数据库,那么您可以使用自动递增数字或序列为图像生成唯一的文件名。
使用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');