#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
toz
не расположены «по порядку»:@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();
}