Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 生成唯一编号作为图像名称_C#_Asp.net - Fatal编程技术网

C# 生成唯一编号作为图像名称

C# 生成唯一编号作为图像名称,c#,asp.net,C#,Asp.net,我是asp.net c#的初学者,开始开发一个网站,现在卡在图片上传表单上。我必须生成一个唯一的数字作为图像的名称,并将图像存储在images文件夹中。如何使用c#在asp.net中生成超过2位的唯一数字。唯一编号也可以包括字母 非常感谢您的帮助。 谢谢 正如格米所说,4位数的唯一数字将限制您只能看到10000张图像。如果您事先知道,您将永远不会拥有超过10000张图像,那么您可以从0开始,每次递增1以获得唯一的ID 更好的解决方案是使用guid。guid是全局唯一的id Guid g = Gu

我是asp.net c#的初学者,开始开发一个网站,现在卡在图片上传表单上。我必须生成一个唯一的数字作为图像的名称,并将图像存储在images文件夹中。如何使用c#在asp.net中生成超过2位的唯一数字。唯一编号也可以包括字母

非常感谢您的帮助。
谢谢

正如格米所说,4位数的唯一数字将限制您只能看到10000张图像。如果您事先知道,您将永远不会拥有超过10000张图像,那么您可以从0开始,每次递增1以获得唯一的ID

更好的解决方案是使用guid。guid是全局唯一的id

Guid g = Guid.NewGuid();

这样,您就不必担心实现和检查文件名是否唯一,因为它们保证是唯一的。

我建议您不要为此使用4位数字,因为您只能获得10000个。看看-它的设计是为了给你独特的价值

如果数字不必是随机的,你可以每次增加一个计数器,并跟踪它

如果您真的打算使用0-10000之间的随机数,您可以使用以下内容:

Random r = new Random(); // <-- this should be only called once and not every time you want a random number
int nextRandom = r.Next(10000);
// as per the updated question, you want at least two digits
int nextRandomTwoDigits = r.Next(9990) + 10;
Guid newGuid = Guid.NewGuid();
string imageName = newGuid.ToString();
Guid
s被设计为唯一的,因此您在这方面不会有任何问题

GUID是一个128位整数(16字节),可以在需要唯一标识符的所有计算机和网络中使用。这样的标识符被复制的概率非常低


(请参阅)。

正如大家所说,4位数字非常小,除非在有限的使用情况下,否则不会特别有用

您有几种可能的解决方案。使用Guid通常被认为是最好的解决方案,因为它可以跨多台机器工作,您不必检查和查看刚刚生成的Guid是否已被使用。所有其他方法都需要执行此重复检查,这取决于名称的存储方式,可能是一项繁琐的工作

如果如你所说,你真的需要4位数字,这就是你所允许的,那么随机数对你来说不是最好的。只需按顺序使用关键部分。您可以在目录或数据库中查找第一次使用的最高值,然后按一开始递增(您甚至可以使用联锁递增来增加数字)


但是,正如其他人所说,你应该重新考虑4位数的限制。

你试过这样做吗:

 string filePath = Path.Combine(Server.MapPath("~/UserImages"), Path.GetFileName(Guid.NewGuid() + "_" + file.FileName));

您将保存这些路径。

因为我通过评论询问是否可以包含信件,而您说“可以”,这里有一个替代您已经接受的答案的选项。生成的图像名称相互冲突的可能性要小得多。如果图像名称中只有1个数字或字母(小写或大写),则奇数为1/(10+26+26)。如果图像名称中有n个数字或字母(小写或大写),则奇数会小得多。事实上是(1/62)^n。(^的力量)。无论如何,代码如下:

 public char GenerateChar(System.Random random)
 {
        char randomChar;
        int next = random.Next(0, 62);
        if (next < 10)
        {
            randomChar = (char) (next + '0'); //0, 1, 2 ... 9
        }
        else if (next < 36)
        {
            randomChar = (char) (next - 10 + 'A'); //A, B, C ... Z
        }
        else
        {
            randomChar = (char) (next - 36 + 'a'); //a, b, c ... z
        }
        return randomChar;
}

public string GenerateString(System.Random random, int length)
{
        char[] randomStr = new char[length];
        for (int i = 0; i < length; i++)
        {
            randomStr[i] = GenerateChar(random);
        }
        return new string(randomStr);
}
public char GenerateChar(System.Random)
{
随机字符;
int next=random.next(0,62);
如果(下一个<10)
{
randomChar=(char)(next+'0');//0,1,2…9
}
否则如果(下一个<36)
{
randomChar=(char)(next-10+'A');//A,B,C…Z
}
其他的
{
randomChar=(char)(next-36+'a');//a,b,c…z
}
返回随机字符;
}
公共字符串生成器(System.Random,int-length)
{
char[]randomStr=新字符[长度];
for(int i=0;i

正如一些人指出的那样,只需对new Random()进行一次调用,或者将其设置为静态或类似的方式,并在每次调用GenerateString()时传递它。

我现在知道它是一个旧线程,但我记得我自己说过为什么不这样做,让我们使用日期时间标记作为其他线程的替代。 如果将图像名存储在数据库中,则必须考虑字节。 因此,与guid(不带破折号)相比:

那么:

  • 结果是:637483067615257804
  • guidUnique结果是:72fdea88b6074595875d7a6240c390f1
  • 最后一件事,我必须提一提。在同一线程中,日期时间刻度将始终是唯一的。在线程场景中,您必须非常小心


    快乐编码

    要添加到此对话中:

    如果您希望保留真实ID以存储原因,但希望用户使用这些图像和/或以不同方式生成其文件名,则可以使用库,如

    基本上,你插入一个“salt”和一个数字,你得到一个哈希值,这个哈希值在你的系统中是可逆的(因为你知道salt!),但用户很难逆转。这也可能有助于防止刮刀扫描端点

    您的上载处理程序将如下所示

    
    private readonly IHashids_hashidsource=新Hashids(“咸盐”);
    异步任务HandleUploadedImage(MyImage img、CancellationToken ct)
    {
    //假设MyImage.Id是由每个上传的图像自动生成的int。
    var hashedFilename=\u hashidsSource.Encode(img.Id);
    img.Filename=哈希文件名;
    //待办事项:???
    //利润。
    }
    
    4位数的唯一数字
    ?祝你好运。你知道你只能得到10000个,对吗?我建议你使用像
    Guid
    这样的东西。如果你有超过10000个图像,它们怎么可能是唯一的呢?只需使用Guid,而不是整数
    myImage.ID=Guid.NewGuid()
    在这个宇宙中保证是随机的。可以包含字母吗?建议一些替代方案。在我的例子中,这是一个网站,用户存储的图像不会超过100张。我只是允许用户动态上传他的图库的图像。为什么要使用
    随机
     long ticks = DateTime.Now.Ticks;
     string tickUnique = String.Format("{0}", ticks);
     string guidUnique = Guid.NewGuid().ToString();
     guidUnique = guidUnique.Replace("-", "");