SSR для реактивно-редукционного применения с парусами

Самый быстрый GUID, как метод генератора строк в формате XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Это не создает стандартно-совместимый GUID.

Десять миллионов исполнений этой реализации занимают всего 32,5 секунды, что является самым быстрым из всех, что я когда-либо видел в браузере (единственное решение без циклов / итераций).

Функция такая же простая, как:

/**
 * Generates a GUID string.
 * @returns {String} The generated GUID.
 * @example af8a8416-6e18-a307-bd9c-f2c947bbb3aa
 * @author Slavik Meltser (slavik@meltser.info).
 * @link http://slavik.meltser.info/?p=142
 */
function guid() {
    function _p8(s) {
        var p = (Math.random().toString(16)+"000000000").substr(2,8);
        return s ? "-" + p.substr(0,4) + "-" + p.substr(4,4) : p ;
    }
    return _p8() + _p8(true) + _p8(true) + _p8();
}

Чтобы проверить производительность, вы можете запустить этот код:

console.time('t'); 
for (var i = 0; i < 10000000; i++) { 
    guid(); 
};
console.timeEnd('t');

Я уверен, что большинство из вы поймете, что я там сделал, но, возможно, есть хотя бы один человек, которому потребуется объяснение:

Алгоритм:

  • Функция Math.random() возвращает десятичную число между 0 и 1 с 16 цифрами после точки десятичной дроби (например, 0.4363923368509859).
  • Затем мы берем это число и преобразуем его в строку с базой 16 (из приведенного выше примера мы будем get 0.6fb7687f). Math.random().toString(16).
  • Затем мы отключим префикс 0. (0.6fb7687f => 6fb7687f) и получим строку с восемью шестнадцатеричными символами. (Math.random().toString(16).substr(2,8).
  • Иногда функция Math.random() возвращает более короткое число (например, 0.4363), из-за нулей в конце (из приведенного выше примера фактически число 0.4363000000000000). Вот почему я добавляю к этой строке "000000000" (строка с девятью нулями), а затем отрезаю ее функцией substr(), чтобы сделать ее девятью символами (заполнение нулей вправо).
  • Причина добавления ровно девяти нулей из-за худшего сценария, когда функция Math.random() вернет ровно 0 или 1 (вероятность 1/10 ^ 16 для каждого из них). Вот почему нам нужно было добавить к нему девять нулей ("0"+"000000000" или "1"+"000000000"), а затем отрезать его от второго индекса (3-й символ) длиной до восьми символов. Для остальных случаев добавление нулей не повредит результату, потому что оно все равно отключает его. Math.random().toString(16)+"000000000").substr(2,8).

Сборка:

  • GUID находится в следующем формате XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.
  • Я разделил GUID на 4 части, каждая часть разделена на 2 типа (или форматы): XXXXXXXX и -XXXX-XXXX.
  • Теперь я создаю GUID, используя эти 2 типа, чтобы собрать GUID с вызовом 4 штуки, следующим образом: XXXXXXXX -XXXX-XXXX -XXXX-XXXX XXXXXXXX.
  • Чтобы различаться между этими двумя типами, я добавил параметр флага функции создания пары _p8(s), параметр s сообщает функция, добавить ли тире или нет.
  • В конце концов мы создаем GUID со следующей цепочкой: _p8() + _p8(true) + _p8(true) + _p8() и возвращаем его.

Ссылка на этот пост в моем блоге

Наслаждайтесь! : -)

1
задан Jafar rezaei 22 January 2019 в 08:05
поделиться

1 ответ

Другие вопросы по тегам:

Похожие вопросы: