Преобразовать метку времени в алфавит - PullRequest
1 голос
/ 20 сентября 2008

У меня есть приложение, в котором пользователь должен запомнить и вставить метку времени Unix, например 1221931027. Чтобы упростить запоминание ключа, который мне нравится, уменьшите количество символов для вставки, разрешив ввод символов [a-z]. Поэтому я ищу алгоритм для преобразования временной метки в более короткую буквенную версию и делаю то же самое в обратном направлении. Есть намеки?

Ответы [ 4 ]

5 голосов
/ 20 сентября 2008

Вы можете просто конвертировать метку времени в base-36.

2 голосов
/ 20 сентября 2008
#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
*/
0 голосов
/ 20 сентября 2008

Другой вариант, который иногда используется для таких вещей, как использование списков слогов. то есть. у вас есть список слогов, таких как ['a', 'ab', 'ba', 'bi', 'bo', 'ca', '...] и преобразование числа в основание (len (list_of_syllables)). Это длиннее с точки зрения букв, но часто легче запомнить что-то вроде «flobagoka», чем что-то вроде «af3q5jl». (Недостатком является то, что можно легко генерировать слова, которые звучат как ненормативная лексика)

[Редактировать] Вот пример такого алгоритма. Используя это, 1221931027 будет "buruvadrage"

0 голосов
/ 20 сентября 2008

конвертировать метку времени в HEX. Это сгенерирует для вас более короткое буквенно-цифровое число из отметки времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...