Skip to content

Instantly share code, notes, and snippets.

@dgritsko
Created March 14, 2014 19:15
Show Gist options
  • Star 35 You must be signed in to star a gist
  • Fork 14 You must be signed in to fork a gist
  • Save dgritsko/9554733 to your computer and use it in GitHub Desktop.
Save dgritsko/9554733 to your computer and use it in GitHub Desktop.
Naive bijective function in C#. http://stackoverflow.com/questions/742013
namespace Alphabet
{
public class AlphabetTest
{
public static readonly string Alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
public static readonly int Base = Alphabet.Length;
public static string Encode(int i)
{
if (i == 0) return Alphabet[0].ToString();
var s = string.Empty;
while (i > 0)
{
s += Alphabet[i % Base];
i = i / Base;
}
return string.Join(string.Empty, s.Reverse());
}
public static int Decode(string s)
{
var i = 0;
foreach (var c in s)
{
i = (i * Base) + Alphabet.IndexOf(c);
}
return i;
}
public static void Main(string[] args)
{
// Simple test of encode/decode operations
for (var i = 0; i < 10000; i++)
{
if (Decode(Encode(i)) != i)
{
System.Console.WriteLine("{0} is not {1}", Encode(i), i);
break;
}
}
}
}
}
@aloisdg
Copy link

aloisdg commented Sep 8, 2016

I think you are missing the "aa, ab, ac" part.

@suren2k44
Copy link

Hi,
Decoding function is returning value in minus,
if I am passing the URL of any text file like as
int randomnumber = CreateShortURL.Decode("http://hostname/Documents/List_2016-09-09.txt");

below is function:

public static int Decode(string s)
{
var i = 0;

            foreach (var c in s)
            {

                i = (i * Base) + Alphabet.IndexOf(c);
            }

            return i;
        }

Due to that I'm not able to receive the shortUrl value from Encode function.
Please help.

Thanks, Suren

@SlyDen
Copy link

SlyDen commented Feb 16, 2018

@suren2k44 But the idea is that it doesn't encode free text string ... it encodes Integer - e.g. the generated ID in database table where you store that link. So the result of the encoding is a proper string and it can be decoded back to that integer. So after decoding you get your ID in database and go retrieve it.

@danboone
Copy link

danboone commented Jan 7, 2019

update to use string builder and reverse in one step

public string Encode(int i)
        {
            if (i == 0) return Alphabet[0].ToString();

            var s = new StringBuilder();// string.Empty;

            while (i > 0)
            {
                s.Insert(0, Alphabet[i % Base]);
                i = i / Base;
            }

            return  s.ToString();
        }

@MrModest
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment