tags:

views:

460

answers:

4

I have an application where an user has to remember and insert an unix timestamp like 1221931027. In order to make it easier to remember the key I like to reduce the number of characters to insert through allowing the caracters [a-z]. So I'm searching for an algorithm to convert the timstamp to a shorter alphanum version and do the same backwards. Any hints?

+4  A: 

You could just convert the timestamp into base-36.

Noether
Or if you allow upper case characters, base62 which almost halfs the number of characters required.
freespace
A: 

convert the timestamp to HEX. That will generate a shorter alphanumeric number for you out of the timestamp.

Stephen Wrighton
A: 

Another option sometimes used for things like this is to use lists of syllables. ie. you have a list of syllables like ['a','ab', 'ba','bi','bo','ca','...] and transform the number into base(len(list_of_syllables)). This is longer in terms of letters, but it can often be easier to memorise something like "flobagoka' than something like 'af3q5jl'. (The downside is that it can be easy to generate words that sound like profanity)

[Edit] Here's an example of such an algorithm. Using this, 1221931027 would be "buruvadrage"

Brian
+1  A: 
#include <time.h>
#include <stdio.h>

// tobase36() returns a pointer to static storage which is overwritten by 
// the next call to this function. 
//
// This implementation presumes ASCII or Latin1.

char * tobase36(time_t n)
{
  static char text[32];
  char *ptr = &text[sizeof(text)];
  *--ptr = 0; // NUL terminator

  // handle special case of n==0
  if (n==0) {
    *--ptr = '0';
    return ptr;
  }

  // some systems don't support negative time values, but some do
  int isNegative = 0;
  if (n < 0)
  {
    isNegative = 1;
    n = -n;
  }

  // this loop is the heart of the conversion
  while (n != 0)
  {
    int digit = n % 36;
    n /= 36;
    *--ptr = digit + (digit < 10 ? '0' : 'A'-10);
  }

  // insert '-' if needed
  if (isNegative)
  {
    *--ptr = '-';
  }

  return ptr;
}

int main(int argc, const char **argv)
{
  int i;
  for (i=1; i<argc; ++i)
  {
    long timestamp = atol(argv[i]);
    printf("%12d => %8s\n", timestamp, tobase36(timestamp));
  }
}

/*
$ gcc -o base36 base36.c
$ ./base36 0 1 -1 10 11 20 30 35 36 71 72 2147483647 -2147483647
           0 =>        0
           1 =>        1
          -1 =>       -1
          10 =>        A
          11 =>        B
          20 =>        K
          30 =>        U
          35 =>        Z
          36 =>       10
          71 =>       1Z
          72 =>       20
  2147483647 =>   ZIK0ZJ
 -2147483647 =>  -ZIK0ZJ
*/
Thom Boyer