2008-09-20 7 views
1

J'ai une application où un utilisateur doit se rappeler et insérer un horodatage unix comme 1221931027. Afin de faciliter le rappel de la clé, j'aime réduire le nombre de caractères à insérer en permettant aux caractères [ az]. Je suis donc à la recherche d'un algorithme pour convertir l'horodatage en une version alphanum plus courte et faire la même chose en arrière. Des indices?Convertir timestamp en alphanum

+0

cela me semble une exigence bizarre. Pourriez-vous nous expliquer pourquoi vous faites cela? Peut-être qu'il ya une meilleure façon – dmckee

Répondre

5

Vous pouvez simplement convertir l'horodatage en base-36.

+0

Ou si vous autorisez des caractères majuscules, base62, soit près de la moitié du nombre de caractères requis. – freespace

0

convertir l'horodatage en HEX. Cela générera un nombre alphanumérique plus court pour vous hors de l'horodatage.

0

Une autre option parfois utilisée pour des choses comme ceci est d'utiliser des listes de syllabes. c'est à dire. vous avez une liste de syllabes comme ['a', 'ab', 'ba', 'bi', 'bo', 'ca', '...] et transformez le nombre en base (len (list_of_syllables)). C'est plus long en termes de lettres, mais il peut souvent être plus facile de mémoriser quelque chose comme "flobagoka" que quelque chose comme 'af3q5jl' (l'inconvénient est qu'il peut être facile de générer des mots qui ressemblent à du blasphème)

[ Modifier] Here's un exemple d'un tel algorithme. en utilisant ce, 1221931027 serait « buruvadrage »

2
#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 
*/