Как сгенерировать уникальное (короткое) имя папки URL на лету ... как Bit.ly - PullRequest
3 голосов
/ 12 апреля 2011

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

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

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

www.mydomain.com / ABCDEF

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

Ответы [ 4 ]

2 голосов
/ 12 апреля 2011

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

8, 9, а, б ...

A, B, C ...

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

Вы поняли.

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

0 голосов
/ 18 октября 2012

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

    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(); 
    }
0 голосов
/ 12 апреля 2011

В 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);
0 голосов
/ 12 апреля 2011

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

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

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

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

...