如何设计一个小网址或网址缩短器?

如何设计一个系统来接收大的URL,比如“https://www.geeksforgeeks.org/count-sum-of-digits-in-numbers-from-1-to-n/“并将它们转换为一个6个字符的短URL。URL存储在数据库中,每个URL都有一个关联的整数id。 需要注意的一件重要事情是,长URL也应该与短URL唯一可识别。所以我们需要一个 双射函数

null

我们强烈建议您在继续解决方案之前单击此处并进行练习。

简单解决方案 可能是散列。使用哈希函数将长字符串转换为短字符串。在散列中,这可能是冲突(两个长URL映射到同一个短URL),我们需要为每个长URL创建一个唯一的短URL,以便我们可以访问长URL。 A. 更好的解决方案 是使用存储在数据库中的整数id,并将整数转换为最多6个字符的字符串。这个问题基本上可以看作是一个基本的转换问题,我们有一个10位的输入数字,我们想把它转换成一个6个字符长的字符串。 下面是关于URL中可能的字符的一个重要观察结果。 URL字符可以是以下字符之一 1) 小写字母[‘A’到’z’],总共26个字符 2) 大写字母表[‘A’到’Z’],总共26个字符 3) 一个数字[‘0’到’9’,总共10个字符 总共有26+26+10=62个可能的字符。 因此,任务是将十进制数转换为以62为基数的数字。 要获取原始的长URL,我们需要在数据库中获取URL id。可以使用从62进制到十进制的转换来获得id。

C++

// C++ program to generate short url from integer id and
// integer id back from short url.
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
// Function to generate a short url from integer ID
string idToShortURL( long int n)
{
// Map to store 62 possible characters
char map[] = "abcdefghijklmnopqrstuvwxyzABCDEF"
"GHIJKLMNOPQRSTUVWXYZ0123456789" ;
string shorturl;
// Convert given integer id to a base 62 number
while (n)
{
// use above map to store actual character
// in short url
shorturl.push_back(map[n%62]);
n = n/62;
}
// Reverse shortURL to complete base conversion
reverse(shorturl.begin(), shorturl.end());
return shorturl;
}
// Function to get integer ID back from a short url
long int shortURLtoID(string shortURL)
{
long int id = 0; // initialize result
// A simple base conversion logic
for ( int i=0; i < shortURL.length(); i++)
{
if ( 'a' <= shortURL[i] && shortURL[i] <= 'z' )
id = id*62 + shortURL[i] - 'a' ;
if ( 'A' <= shortURL[i] && shortURL[i] <= 'Z' )
id = id*62 + shortURL[i] - 'A' + 26;
if ( '0' <= shortURL[i] && shortURL[i] <= '9' )
id = id*62 + shortURL[i] - '0' + 52;
}
return id;
}
// Driver program to test above function
int main()
{
int n = 12345;
string shorturl = idToShortURL(n);
cout << "Generated short url is " << shorturl << endl;
cout << "Id from url is " << shortURLtoID(shorturl);
return 0;
}


JAVA

// Java program to generate short url from integer id and
// integer id back from short url.
import java.util.*;
import java.lang.*;
import java.io.*;
class GFG
{
// Function to generate a short url from integer ID
static String idToShortURL( int n)
{
// Map to store 62 possible characters
char map[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" .toCharArray();
StringBuffer shorturl = new StringBuffer();
// Convert given integer id to a base 62 number
while (n > 0 )
{
// use above map to store actual character
// in short url
shorturl.append(map[n % 62 ]);
n = n / 62 ;
}
// Reverse shortURL to complete base conversion
return shorturl.reverse().toString();
}
// Function to get integer ID back from a short url
static int shortURLtoID(String shortURL)
{
int id = 0 ; // initialize result
// A simple base conversion logic
for ( int i = 0 ; i < shortURL.length(); i++)
{
if ( 'a' <= shortURL.charAt(i) &&
shortURL.charAt(i) <= 'z' )
id = id * 62 + shortURL.charAt(i) - 'a' ;
if ( 'A' <= shortURL.charAt(i) &&
shortURL.charAt(i) <= 'Z' )
id = id * 62 + shortURL.charAt(i) - 'A' + 26 ;
if ( '0' <= shortURL.charAt(i) &&
shortURL.charAt(i) <= '9' )
id = id * 62 + shortURL.charAt(i) - '0' + 52 ;
}
return id;
}
// Driver Code
public static void main (String[] args) throws IOException
{
int n = 12345 ;
String shorturl = idToShortURL(n);
System.out.println( "Generated short url is " + shorturl);
System.out.println( "Id from url is " +
shortURLtoID(shorturl));
}
}
// This code is contributed by shubham96301


Python3

# Python3 code for above approach
def idToShortURL( id ):
map = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
shortURL = ""
# for each digit find the base 62
while ( id > 0 ):
shortURL + = map [ id % 62 ]
id / / = 62
# reversing the shortURL
return shortURL[ len (shortURL): : - 1 ]
def shortURLToId(shortURL):
id = 0
for i in shortURL:
val_i = ord (i)
if (val_i > = ord ( 'a' ) and val_i < = ord ( 'z' )):
id = id * 62 + val_i - ord ( 'a' )
elif (val_i > = ord ( 'A' ) and val_i < = ord ( 'Z' )):
id = id * 62 + val_i - ord ( 'Z' ) + 26
else :
id = id * 62 + val_i - ord ( '0' ) + 52
return id
if (__name__ = = "__main__" ):
id = 12345
shortURL = idToShortURL( id )
print ( "Short URL from 12345 is : " , shortURL)
print ( "ID from" , shortURL, "is : " , shortURLToId(shortURL))


C#

// C# program to generate short url from integer id and
// integer id back from short url.
using System;
public class GFG
{
// Function to generate a short url from integer ID
static String idToShortURL( int n)
{
// Map to store 62 possible characters
char []map = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" .ToCharArray();
String shorturl = "" ;
// Convert given integer id to a base 62 number
while (n > 0)
{
// use above map to store actual character
// in short url
shorturl+=(map[n % 62]);
n = n / 62;
}
// Reverse shortURL to complete base conversion
return reverse(shorturl);
}
static String reverse(String input) {
char [] a = input.ToCharArray();
int l, r = a.Length - 1;
for (l = 0; l < r; l++, r--) {
char temp = a[l];
a[l] = a[r];
a[r] = temp;
}
return String.Join( "" ,a);
}
// Function to get integer ID back from a short url
static int shortURLtoID(String shortURL)
{
int id = 0; // initialize result
// A simple base conversion logic
for ( int i = 0; i < shortURL.Length; i++)
{
if ( 'a' <= shortURL[i] &&
shortURL[i] <= 'z' )
id = id * 62 + shortURL[i] - 'a' ;
if ( 'A' <= shortURL[i] &&
shortURL[i] <= 'Z' )
id = id * 62 + shortURL[i] - 'A' + 26;
if ( '0' <= shortURL[i] &&
shortURL[i] <= '9' )
id = id * 62 + shortURL[i] - '0' + 52;
}
return id;
}
// Driver Code
public static void Main(String[] args)
{
int n = 12345;
String shorturl = idToShortURL(n);
Console.WriteLine( "Generated short url is " + shorturl);
Console.WriteLine( "Id from url is " +
shortURLtoID(shorturl));
}
}
// This code is contributed by 29AjayKumar


Javascript

<script>
// Javascript program to generate short url from integer id and
// integer id back from short url.
// Function to generate a short url from integer ID
function idToShortURL(n)
{
// Map to store 62 possible characters
let map = "abcdefghijklmnopqrstuvwxyzABCDEF"
"GHIJKLMNOPQRSTUVWXYZ0123456789" ;
let shorturl = [];
// Convert given integer id to a base 62 number
while (n)
{
// use above map to store actual character
// in short url
shorturl.push(map[n % 62]);
n = Math.floor(n / 62);
}
// Reverse shortURL to complete base conversion
shorturl.reverse();
return shorturl.join( "" );
}
// Function to get integer ID back from a short url
function shortURLtoID(shortURL) {
let id = 0; // initialize result
// A simple base conversion logic
for (let i = 0; i < shortURL.length; i++) {
if ( 'a' <= shortURL[i] && shortURL[i] <= 'z' )
id = id * 62 + shortURL[i].charCodeAt(0) - 'a' .charCodeAt(0);
if ( 'A' <= shortURL[i] && shortURL[i] <= 'Z' )
id = id * 62 + shortURL[i].charCodeAt(0) - 'A' .charCodeAt(0) + 26;
if ( '0' <= shortURL[i] && shortURL[i] <= '9' )
id = id * 62 + shortURL[i].charCodeAt(0) - '0' .charCodeAt(0) + 52;
}
return id;
}
// Driver program to test above function
let n = 12345;
let shorturl = idToShortURL(n);
document.write( "Generated short url is " + shorturl + "<br>" );
document.write( "Id from url is " + shortURLtoID(shorturl));
// This code is contributed by gfgking.
</script>


输出:

Generated short url is dnhId from url is 12345

优化:我们可以避免IDToSortUrl()中的反向步骤。为了确保返回相同的ID,我们还需要将shortURLtoID()更改为从头到尾处理字符。 本文的计算公式为 希瓦姆 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享