我正在创建一个应用程序,它将在Web服务器上创建大量文件夹,其中包含文件。
我需要文件夹名称是唯一的。我可以使用GUID轻松完成此操作,但我想要一些更友好的用户。它不需要用户说话,但应该是短的和标准字符(alphas是最好的)。
简而言之:我正在寻找像Bit.ly那样的独特名称:
www.mydomain.com/ABCDEF
有关于如何做到这一点的很好的参考?我的平台将是.NET / C#,但是对于一般概念的任何帮助,参考,链接等,或任何解决此任务的整体建议都可以。
答案 0 :(得分:2)
从1开始。增加到2,3,4,5,6,7,
8,9,a,b ......
A,B,C ......
X,Y,Z,10,11,12,...... 1a,1b,
你明白了。
你有一个同步的全局int / long“next id”,用基数62(数字,小写,大写)或36或者其他东西表示。
答案 1 :(得分:0)
我假设您知道如何使用Web服务器的重定向功能。如果您需要帮助,请发表评论:)。
我这样做的方法是生成一个随机整数(在'a'和'z'的整数值之间);将其转换为char;将它附加到字符串;并重复,直到我们达到所需的长度。如果它已在数据库中生成值,请重复此过程。如果它是唯一的,则将其存储在数据库中,其中包含实际位置的名称和别名的名称。
这有点像黑客,因为它假设'a'到'z'实际上是整数值的顺序。
我能想到的最好:(。
答案 2 :(得分:0)
在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 :(得分:0)
我需要类似于你想要完成的事情。我重新编写代码以生成文件夹,所以试试这个。它是一个控制台应用程序的设置,但您也可以在网站中使用它。
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();
}