Сжать дату до уникальных буквенно-цифровых символов

Если у меня есть дата ГГММДДЧЧммсс, например 190525234530, как мне определить наименьшее количество символов для ее представления с помощью 0-9a-z (36 символов)?

Я считаю, что существует 3 153 600 000 комбинаций (100 лет * 365 дней * 24 часа * 60 минут * 60 секунд), которые уместились бы в 32 бита. Означает ли это, что я могу представить эти даты, используя 4 символа?

Я немного не понимаю, как сделать преобразование, поэтому, если бы кто-нибудь мог показать мне математику, я был бы очень признателен.


person Craig    schedule 07.05.2019    source источник
comment
Это в основном представляет дату как количество секунд из какой-то эпохи... например. юникс время.   -  person Dan Mašek    schedule 08.05.2019
comment
Однако то, что вы, кажется, хотите сделать, это использовать кодировку base36... это приведет к значительному расширению - вам понадобится 7 символов для представления любого 32-битного целого числа.   -  person Dan Mašek    schedule 08.05.2019
comment
Как сказал @DanMašek, используйте стандартный счет секунд с эпохи Unix, а затем найдите алгоритм для печати в базе (основании) 36. Это должно быть описано во многих местах. Секунды для этого века увеличиваются до 4 102 444 799 (в зависимости от часового пояса), что может быть представлено 7 цифрами по основанию 36 (36^6 — это 2 176 782 336, что недостаточно, но 36^7 — это 78 364). 164 096, что достаточно).   -  person Ole V.V.    schedule 08.05.2019
comment
@ОлеВ.В. Спасибо, что указали мне правильное направление.   -  person Craig    schedule 08.05.2019


Ответы (1)


В конце концов я сделал это на JavaScript, я решил, что хочу сжать до 6 символов, поэтому я создал свое собственное время, которое генерирует уникальные идентификаторы на срок до 68 лет с 01.01.2019, что сработало для меня.

function getId() {
  //var newTime = parseInt(moment().format("X")) - 1546300800;//seconds since 01/01/2019
  var newTime = Math.floor((new Date()).getTime() / 1000) - 1546300800;//seconds since 01/01/2019
  var char = "0123456789abcdefghijklmnopqrstuvwxyz";//base 36
  return char[Math.floor(newTime / 36**5)]+
  char[Math.floor(newTime%36**5 / 36**4)]+
  char[Math.floor(newTime%36**4 / 36**3)]+
  char[Math.floor(newTime%36**3 / 36**2)]+
  char[Math.floor(newTime%36**2 / 36)]+
  char[Math.floor(newTime%36)];
}
console.log(getId());

Thanks to @user956584 this can be be changed to:

function getId() {
  //var newTime = parseInt(moment().format("X")) - 1546300800;//seconds since 01/01/2019
  var newTime = Math.floor((new Date()).getTime() / 1000) - 1546300800;//seconds since 01/01/2019
  return newTime.toString(36);
}
console.log(getId());

person Craig    schedule 08.05.2019
comment
или (128482).toString(36); stackoverflow.com/a/9542744 - person user956584; 09.05.2021