DEV Community

Saurabh Kumar
Saurabh Kumar

Posted on

3 2

A Tiny URL design and code ✔️

This is a simple encode() and decode() function.

Note that we haven't created the MD5 hashing approach here as this only deals with the concept.

Step:

encode()

  • save the long url in db, get a unique long id from db for that url
  • pass that long id to the encode(id) function
  • so for a long value we keep diving it by 62 and pick a value from the allowed chars array and keep adding it
  • make sure to reverse the created string
    private static final String allowedString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    private final char[] allowedCharacters = allowedString.toCharArray();
    private final int base = allowedCharacters.length; // 62

    public String encode(long input){
        var encodedString = new StringBuilder();

        if(input == 0) {
            return String.valueOf(allowedCharacters[0]);
        }

        while (input > 0) {
            encodedString.append(allowedCharacters[(int) (input % base)]);
            input = input / base;
        }

        return encodedString.reverse().toString();
    }
Enter fullscreen mode Exit fullscreen mode

decode()

  • send the last part of the url - which is the encoded string
  • convert the string to array
  • from first value we pick index of value and multiply it with 62^remaining characters
  • the number is the decoded id
    public long decode(String input) {
        var characters = input.toCharArray();
        var length = characters.length;

        var decoded = 0;

        //counter is used to avoid reversing input string
        var counter = 1;
        for (char character : characters) {
            decoded += allowedString.indexOf(character) * Math.pow(base, length - counter);
            counter++;
        }
        return decoded;
    }
Enter fullscreen mode Exit fullscreen mode

So if we have the decoded url, we could simply return it as a header location - with the response code of 302 (FOUND)

@GetMapping(value = "{shortUrl}")
public ResponseEntity<Void> getAndRedirect(@PathVariable String shortUrl) {
        var url = urlService.getOriginalUrl(shortUrl);
        return ResponseEntity.status(HttpStatus.FOUND)
                .location(URI.create(url))
                .build();
    }
}
Enter fullscreen mode Exit fullscreen mode

The problems:

  1. we are relaying on a single db table id to generate the ids
  2. not scalable, how do we handle a fixed size return url
  3. how do we allow customised URLs
  4. can we reuse a short-url which is removed/expired?

I will be working on a more distributed solutions in coming posts, Thanks you for reaching here.
Here's a 🍪

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay