Как сгенерировать уникальное (короткое) имя папки URL на лету…нравится Bit.ly

#url #bit.ly #dynamic-folders

#url #bit.ly #динамические папки

Вопрос:

Я создаю приложение, которое создаст большое количество папок на веб-сервере с файлами внутри них.

Мне нужно, чтобы имя папки было уникальным. Я могу легко сделать это с помощью GUID, но я хочу что-то более удобное для пользователя. Оно не обязательно должно быть доступно для пользователей, но должно состоять из коротких стандартных символов (лучше всего из букв).

Короче говоря: я хочу сделать что-то вроде Bit.ly делает с их уникальными именами:

www.mydomain.com/ABCDEF

Есть ли хорошая ссылка на то, как это сделать? Моей платформой будет .NET / C #, но я согласен с любой помощью, ссылками и т.д. По общей концепции или любым общим советом по решению этой задачи.

Ответ №1:

Начните с 1. Увеличить до 2, 3, 4, 5, 6, 7,

8, 9, a, b…

A, B, C…

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

Вы поняли идею.

У вас есть синхронизированный глобальный int / long «следующий идентификатор» и представить его в базе 62 (цифры, нижний регистр, заглавные буквы) или базе 36 или что-то в этом роде.

Ответ №2:

Я предполагаю, что вы знаете, как использовать возможности перенаправления вашего веб-сервера. Если вам нужна помощь, просто прокомментируйте :).

Способ, которым я бы это сделал, состоял бы в генерации случайного целого числа (между целочисленными значениями ‘a’ и ‘z’); преобразовании его в символ; добавлении его к строке; и повторении до тех пор, пока мы не достигнем необходимой длины. Если оно генерирует значение, уже имеющееся в базе данных, повторите процесс. Если оно было уникальным, сохраните его в базе данных с названием фактического местоположения и именем псевдонима.

Это немного похоже на взлом, потому что предполагается, что ‘a’ через ‘z’ на самом деле находятся в последовательности их целочисленных значений.

Лучшее, что я мог придумать: (.

Комментарии:

1. На самом деле, это не делает такого предположения, поскольку вы можете использовать таблицу подстановки. Например, следующее работает в системе EBCDIC, где a to z не расположены «по порядку»: @lookup = ('a', 'b', 'c', 'd', ...); my $value = $lookup[ rand(0 @lookup) ];

Ответ №3:

На 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);
  

Ответ №4:

Мне нужно было что-то похожее на то, что вы пытаетесь выполнить. Я переделал свой код для генерации папок, так что попробуйте это. Оно настроено для консольного приложения, но вы также можете использовать его на веб-сайте.

     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(); 
    }