Статьи

Понимание математики Base-36

Меня зовут 13 символов. Мое имя из 13 символов не означает ничего уникального. Даже мой девятизначный номер социального страхования заходит так далеко. В моей стране, Канаде, это определяет меня конкретно, но у любой другой страны с девятизначной системой счисления социального страхования, скорее всего, будет член с таким же номером, как у меня.

Что если один номер может адресовать каждого живого человека, быть короче имени и короче номера социального страхования? Вы не можете сделать это с номерами Base-10, но с Base-36 это просто.

Мы используем базовую десятку настолько, что не учитываем полезность увеличения на порядки десять с каждой цифрой, которую мы добавляем к числу. С двумя цифрами мы можем перейти от 0 до 99. Шестнадцатеричное идет дальше: с двумя шестнадцатеричными цифрами мы можем получить 255 — от 0 до FF.

Шестнадцатеричные числа становятся выше десятизначного знака без необходимости изобретать новые числа. Это делается с помощью A, B, C, D, E и F для ссылки с 11-го по 16-й цифры. Base-36 делает этот шаг дальше и использует все привычные символы, с которыми мы знакомы. Base-36 использует числа для обработки первых десяти цифр. Цифры с 11 по 36 обозначены алфавитом от A до Z. Мы знаем порядок чисел от 0 до 9, и мы знаем алфавит, поэтому мы можем предвидеть прогрессирование.

Используя число base-36, можно получить гораздо большие числа с экономией размера. В то время как двузначное число возвращает вас к 99; ZZ, двузначное выражение Base-36 получает значение 1295. Z, ZZZ, ZZZ — это десятичный эквивалент 78 364 164 095.

С этим семизначным номером под Base-36 вы можете ссылаться на каждого живого человека и почти на каждого человека, который когда-либо был жив, со своим уникальным 7-значным номером.

Когда вы доберетесь до восьми цифр, вы сможете охватить Интернет вещей. Восемь цифр на базе 36 означает более двух триллионов (точнее, 2 821 109 907 455).

Base-36 — хороший практический потолок для работы вместо десятичной или шестнадцатеричной последовательностей. PHP и MySQL имеют функции преобразования, которые могут преобразовывать числа в и из base-36. Функциональность есть. Это позволяет хранить более компактные данные.

С человеческой точки зрения было сказано, что многие люди могут запомнить список из 5 вещей плюс или минус два. Многие могут вспомнить важные номера телефонов. И так же, как большинство людей могут вспомнить семизначный телефонный номер, так и можно утверждать, что они могут сохранить семизначное строковое представление чего-то большого — вместо телефонного номера «1 на миллион», семизначного числа 36. Цифра будет представлять одну из 78 миллиардов ссылок.

Как показано выше, большие числа могут быть полезны для адресации больших массивов данных. Facebook хранит свои посты с идентификационными номерами, которые идут вверх.

Пост, который я только что вытащил, имеет идентификационный номер 902352183124757. Пятнадцать цифр — 902 триллиона. Если у них 902 триллиона, а такой парень, как я, выдает сумасшедшее количество постов в день, а десятки миллионов делают, как я, то этот одометр скоро перевернется.

Если бы сообщения были отформатированы в 10-значные 36 цифр, в базе данных было бы больше места для ног (например, доступно почти 4 квадриллиона (3 656 158 440 062 980) ссылок). Если Facebook достиг этого уровня благодаря экспоненциальному росту, и этот экспоненциальный рост выравнивается, то более 2 квадриллионов постов должны предоставить этой базе данных пространство, необходимое для ссылки на новые посты, не переходя к значению googolplex.

Да и нет. Внутри базы данных целые числа являются наиболее экономичным способом хранения данных. Цифры Base-36 считаются строками, а строки — более дорогим хранилищем.

Аналогично, автоинкремент в MySQL будет увеличивать только целые числа. Вы можете отформатировать строки, чтобы быть последовательными. Например, все 10 символов можно использовать с нулями слева от числа, чтобы 0000000008 было восемь, а 00000000ZZ — 1295. При сортировке в алфавитном порядке последовательность будет выглядеть как числовая последовательность. Хотя автоинкремент встроен в MySQL и большинство других реляционных баз данных, это не единственная игра в городе. Вы можете создать новые автоматически сгенерированные числа base-36, связав триггер с таблицей (которую мы обсудим чуть позже), чтобы ввести новые упорядоченные значения при вставке новых записей.

Целью base-36 является уплотнение и актуальность. Вместо 10 цифр для обозначения людей на Земле семь символов будут обращаться ко всем. Вместо 16 цифр для обозначения всех обновлений статуса Facebook можно использовать 10 символов. Когда дело доходит до релевантности, последовательность может быть и возрастающим значением, и некоторые значения могут быть отложены, чтобы объявить дополнительные качества в том, что определяется.

Base-36 может быть использован для ссылки на такие вещи:

  • Люди. Семизначное число base-36 может ссылаться на 78 миллиардов человек. Если вы преобразуете ссылку на пользователя в 7 символов.
  • Коды стран. Коды стран — это уже два символьных представления. Есть 193 признанных страны (написав это, я просто знаю, что какая-то страна разделится на две к тому времени, когда я подойду к закрытой скобке). Стандарт ISO-3166 представляет собой список двухзначных кодов стран. С двумя алфавитными символами можно сослаться на 676 конкретных стран, коды стран могут использовать только два символа. Использование стандарта ISO-3166 оставляет более 400 ссылок неиспользованными, но все же обеспечивает общую и узнаваемую ссылку.
  • Города. В Китае с миллиардным населением более 1020 городов. На эти сообщества можно ссылаться из двух цифр, основанных на 36 цифрах. Во многих странах будет менее 1000 общин. Скажем, ссылки на сообщества становятся действительно конкретными, и чтобы удовлетворить все ссылки, три цифры могут связать 46 655 сообществ внутри одной страны.
  • Устройства. Интернет вещей идет, я уверен. У меня есть три устройства с их собственными беспроводными потребностями. У некоторых технически дружественных людей может быть гораздо больше проводных устройств. Если бы это было 36 устройств на человека, то одна цифра могла бы покрыть все эти устройства. Две цифры для обозначения устройств и вещей покрывают 1295 возможностей.

Эти строки можно объединить, чтобы сделать их уникальными путем объединения символов в упорядоченной последовательности. В следующем примере вы можете сделать ссылку на людей, их местонахождение и их устройства. Вся строка может быть уникальной, в то время как элементы в ней повторяются.

Например: US001200GHK4 может означать:

  • США — код страны
  • 001 — Манхэттен
  • 200GHK4 — уникальный код человека.

Возможно, их устройства будут добавлены в процесс идентификации. Допустим, ноутбук является их основным устройством. Когда их мобильный телефон помещен в рисунок, это второе устройство, связанное с пользователем: US001200GHK42. «2» обозначает это второе устройство.

Если это так, как base-36 работал для создания некоторой идентификации, длина строки будет говорить с тем, что она ассоциирует.

  • Двухзначная длина = страна, использующая стандартные коды ISO-3166
  • Пять цифр длиной = сообщество в стране
  • Двенадцать цифр = человек, проживающий в стране
  • Тринадцать цифр длиной = ссылка на IP-адресуемое устройство, принадлежащее пользователю в определенном сообществе и стране.

С 13 цифрами поиск MySQL для «% США» вернет всех граждан США. «US001%» вернет всех людей на Манхэттене. «US001% 1» покажет основное / предпочтительное устройство, используемое всеми жителями Манхэттена. При такой логике связь может быть направлена ​​на предпочтительный участок сети.

Конечно, есть много чего, если:

  • Что если они поменяют города? С третьего по пятый символы меняются.
  • Что если они прыгнут в другую страну? Первые пять цифр меняются, отражая новые цифры.
  • Что если им принадлежит более 36 устройств? Если это произойдет, то две последние цифры могут представлять их устройство, а не только последнюю — четырнадцатизначный идентификатор # сказал бы: «У этого чувака много гаджетов».

Основная цель создания этих больших чисел и хранения их в качестве базовых 36-ти образцов состоит в том, чтобы практиковать своего рода экономику. Они должны быть последовательными, как индексные ключи, но вам не нужно делать с ними какую-то конкретную математику.

В MySQL строки base-36, хранящиеся как типы данных VARCHAR ведут себя как целые числа. Строки можно сравнивать с помощью агрегатных функций, таких как MAX() и MIN() чтобы получить самые высокие и самые низкие доступные числа соответственно.

Вы также можете получить строку base-36, отсортировав ее в порядке убывания, чтобы сначала получить наибольшее число. В отличие от целых чисел, строки base-36 могут быть отфильтрованы с помощью операторов LIKE если строки представляют собой комбинацию объединенного ряда и возрастающих значений.

В MySQL есть функция CONV() которая может преобразовывать все из числа от base-2 до base-36. Чтобы получить базу 36 к ее эквиваленту базы 10, выполните CONV('ZA', 36, 10) . Чтобы получить его от базы 10 до базы 36, вы можете пойти другим путем. CONV('1294', 10, 36) . Вы можете вложить эти функции, чтобы создать что-то с приращением: CONV(CONV('ZA', 36, 10) + 1, 10, 36) выведет ‘ZB.’

Это может быть вставлено в пользовательскую процедуру, и эта процедура может быть запущена, когда новые записи вставляются в таблицу базы данных. В приведенном ниже примере триггер добавляется в таблицу base_example для выполнения и создания ключа base-36 при добавлении новой записи в таблицу base_example.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
CREATE TABLE IF NOT EXISTS `base_example` (
`bkey` varchar(12) NOT NULL,
`info` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
 
CREATE TRIGGER `b36_incr` BEFORE INSERT ON `base_example` FOR EACH ROW
BEGIN
   DECLARE old_bkey VARCHAR(12);
   DECLARE rowcount INT;
   SELECT COUNT(*), bkey into rowcount, old_bkey FROM `base_example` GROUP BY bkey ORDER BY bkey DESC LIMIT 1;
   IF (1 <= rowcount) AND (old_bkey IS NOT NULL) THEN
      SET new.bkey = LPAD(CONV(CONV(old_bkey, 36, 10) + 1, 10, 36), 12, ‘0’);
   ELSE
      SET new.bkey = LPAD(‘0’, 12, ‘0’);
   END IF;
END

Рисунок 1. Запущенная процедура для создания и увеличения значения.

В этом примере к смеси добавлены два предположения. Во-первых, поле VARCHAR должно быть длиной 12 символов. Во-вторых, значения в поле VARCHAR дополняются нулями слева, поэтому все выходные данные выглядят согласованными и могут быть отсортированы предсказуемым образом.

Base-36 — это круто, но большинство языков по-прежнему ссылаются на базовые 10 и двоичные файлы. Однако PHP может выполнять базовые преобразования, и он достаточно умен, чтобы экстраполировать буквы от A до Z, которые охватывают цифры от 11 до 36.

С помощью простой функции цифрам base-36 можно передать функцию (которую мы вскоре увидим) для преобразования, вычисления и возвращаемого значения. Это делается путем извлечения символов 0-9A-Z из формулы, выполнения вычисления base-36 и последующего преобразования вывода обратно в base-36.

1
2
3
4
5
$bthreesix = «ZZ»;
$zz = base_convert($bthreesix,36,10);
$zz++;
$bthreesix = base_convert($zz,10,36);
echo $bthreesix;

Существует предел того, насколько сложна математика, но я написал пример функции b36math() которая преобразует формулу base-36 в результат base-36.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
print b36math(«ZY++»);
print «<br/>»;
print b36math(«ZW + 9»);
print «<br/>»;
 
function b36math($formula = «») {
   $out = preg_replace_callback(
      «/([\w]+)/»,
      «b36convert»,
      $formula);
   // incr / decr don’t work as advertised
   $out = str_replace(«++», » + 1″, $out);
   $out = str_replace(«—«, » — 1″, $out);
   eval(‘$outer = ‘.$out.’;’);
   return strtoupper(base_convert($outer, 10, 36));
}
 
function b36convert($matches) {
  $digits = «»;
   array_shift($matches);
   foreach ($matches as $key => $match) {
      $digits .= $match;
   }
   $new_number = base_convert($digits, 36, 10);
   return intval($new_number);
}
?>

Рисунок 2. Функция преобразования b36math для выполнения функций, выполняемых с номерами base-36.

Наш мир жаждет данных. На эти данные должна быть хорошая ссылка. В поисках доступа к большим массивам данных использование ссылок, хранящихся в числах с номером 36, является способом хранения больших чисел в меньшем пространстве.

Идет гонка за тем, что является ценным товаром: скоростью обработки, пропускной способностью или хранением. Когда у одного щедрый запас, вы можете потратить его на компенсацию другого. Если у вас есть много доступных циклов для обработки, вы можете хранить данные в громоздком формате и использовать обработку, чтобы сделать их пригодными для использования.

В то время как есть ограничение на количество цифр, на которые можно ссылаться в целом числе, поля varchar могут содержать до 255 символов, а текстовые поля являются открытыми. Могут быть сохранены очень большие числа base-36 для ссылки на отдельные элементы в очень больших массивах данных.