【问题标题】:How to generate unique (short) URL folder name on the fly...like Bit.ly如何动态生成唯一(短)URL 文件夹名称...如 Bit.ly
【发布时间】:2011-08-03 10:17:17
【问题描述】:

我正在创建一个应用程序,它将在 Web 服务器上创建大量文件夹,其中包含文件。

我需要文件夹名称是唯一的。我可以使用 GUID 轻松地做到这一点,但我想要一些对用户更友好的东西。它不需要用户可以说,但应该是短而标准的字符(最好是字母)。

简而言之:我正在寻找像 Bit.ly 那样用它们独特的名字做的事情:

www.mydomain.com/ABCDEF

关于如何做到这一点有很好的参考吗?我的平台将是 .NET/C#,但是对于一般概念的任何帮助、参考、链接等,或解决此任务的任何总体建议都可以。

【问题讨论】:

    标签: url bit.ly dynamic-folders


    【解决方案1】:

    我需要与您想要完成的任务类似的东西。我重组了我的代码以生成文件夹,所以试试这个。它是为控制台应用设置的,但您也可以在网站中使用它。

        private static void genRandomFolders()
        {
            string basepath = "C:\\Users\\{username here}\\Desktop\\";
            int count = 5;
            int length = 8;
    
            List<string> codes = new List<string>();
            int total = 0;
            int i = count;
            Random rnd = new Random();
            while (i-- > 0)
            {
                string code = RandomString(rnd, length);
                if (!codes.Exists(delegate(string c) { return c.ToLower() == code.ToLower(); }))
                {
                    //Create directory here
                    System.IO.Directory.CreateDirectory(basepath + code);
                }
                total++;
                if (total % 100 == 0)
                    Console.WriteLine("Generated " + total.ToString() + " random folders...");
            }
    
            Console.WriteLine();
            Console.WriteLine("Generated " + total.ToString() + " total random folders.");
        }
        public static string RandomString(Random r, int len)
        {
            //string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; //uppercase only
            //string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"; //All
            string str = "abcdefghjkmnpqrstuvwxyz123456789"; //Lowercase only
            StringBuilder sb = new StringBuilder(); 
            while ((len--) > 0)
                sb.Append(str[(int)(r.NextDouble() * str.Length)]);
            return sb.ToString(); 
        }
    

    【讨论】:

      【解决方案2】:

      在 Perl 中,没有模块,因此您可以更轻松地进行翻译。

      sub convert_to_base {
          my ($n, $b) = @_;
          my @digits;
          while ($n) {
              my $digits = $n % $b;
              unshift @digits, $digit;
              $n = ($n - $digit) / $b;
          }
          unshift @digits, 0 if !@digits;
          return @digits;
      }
      
      # Whatever characters you want to use.
      my @digit_set = ( '0'..'9', 'a'..'z', 'A'..'Z' );
      
      # The id of the record in the database,
      # or one more than the last id you generated.
      my $id = 1;
      
      my $converted =
          join '',
          map { $digit_set[$_] }
          convert_to_base($id, 0+@digits_set);
      

      【讨论】:

        【解决方案3】:

        从 1 开始。递增到 2、3、4、5、6、7,

        8、9、a、b...

        A、B、C...

        X, Y, Z, 10, 11, 12, ... 1a, 1b,

        你明白了。

        您有一个同步的全局 int/long “下一个 id”,并以 62 进制(数字、小写、大写)或 36 进制或其他方式表示它。

        【讨论】:

          【解决方案4】:

          我假设您知道如何使用您的网络服务器的重定向功能。如果您需要帮助,请发表评论:)。

          我这样做的方法是生成一个随机整数(在“a”和“z”的整数值之间);将其转换为字符;将其附加到字符串;并重复直到我们达到所需的长度。如果它已在数据库中生成一个值,请重复该过程。如果它是唯一的,则将其与实际位置的名称和别名的名称一起存储在数据库中。

          这有点像 hack,因为它假定 'a' 到 'z' 实际上在它们的整数值中是按顺序排列的。

          我能想到的最好的:(。

          【讨论】:

          • 其实它并没有做这样的假设,因为你可以使用查找表。例如,以下适用于 az 不是“按顺序”的 EBCDIC 系统:@lookup = ('a', 'b', 'c', 'd', ...); my $value = $lookup[ rand(0+@lookup) ];
          • @ikegami:谢谢你的想法! :)
          猜你喜欢
          • 1970-01-01
          • 2015-06-18
          • 1970-01-01
          • 1970-01-01
          • 2013-03-19
          • 2022-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多