我想在我的网站上创建随机文件夹名称来存储图像及其缩略图,但我没有使用生成的 guid 的完整版本,而是考虑只使用它的一部分,可能只是前 8 个字符,可能还有 base64 编码它。我担心可能发生的碰撞。
有人可以为我指出正确的方向,这是否是一个足够好的主意?如果我想将名称保留在一定数量的字符下,是否可以使用其他解决方案?
更新:我试图远离 path.GetRandomFileName ,因为它使用原始 guid 并且不是 12 个字符长......
我想在我的网站上创建随机文件夹名称来存储图像及其缩略图,但我没有使用生成的 guid 的完整版本,而是考虑只使用它的一部分,可能只是前 8 个字符,可能还有 base64 编码它。我担心可能发生的碰撞。
有人可以为我指出正确的方向,这是否是一个足够好的主意?如果我想将名称保留在一定数量的字符下,是否可以使用其他解决方案?
更新:我试图远离 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 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');