После некоторого поиска я нашел этот генератор url в стиле youtube с шифрованием, чтобы скрыть исходный идентификатор … однако я надеюсь повысить эффективность, поскольку он будет использоваться много. Пока я улучшил его на 20% … может ли кто-нибудь помочь мне улучшить его больше.
Это оригинал:
function alphaID($in, $to_num = false, $pad_up = false, $passKey = null) { $index = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; if ($passKey !== null) { // Although this function's purpose is to just make the // ID short - and not so much secure, // with this patch by Simon Franz (http://blog.snaky.org/) // you can optionally supply a password to make it harder // to calculate the corresponding numeric ID for ($n = 0; $n<strlen($index); $n++) { $i[] = substr( $index,$n ,1); } $passhash = hash('sha256',$passKey); $passhash = (strlen($passhash) < strlen($index)) ? hash('sha512',$passKey) : $passhash; for ($n=0; $n < strlen($index); $n++) { $p[] = substr($passhash, $n ,1); } array_multisort($p, SORT_DESC, $i); $index = implode($i); } $base = strlen($index); if ($to_num) { // Digital number <<-- alphabet letter code $in = strrev($in); $out = 0; $len = strlen($in) - 1; for ($t = 0; $t <= $len; $t++) { $bcpow = bcpow($base, $len - $t); $out = $out + strpos($index, substr($in, $t, 1)) * $bcpow; } if (is_numeric($pad_up)) { $pad_up--; if ($pad_up > 0) { $out -= pow($base, $pad_up); } } } else { // Digital number -->> alphabet letter code if (is_numeric($pad_up)) { $pad_up--; if ($pad_up > 0) { $in += pow($base, $pad_up); } } $out = ""; for ($t = floor(log10($in) / log10($base)); $t >= 0; $t--) { $a = floor($in / bcpow($base, $t)); $out = $out . substr($index, $a, 1); $in = $in - ($a * bcpow($base, $t)); } $out = strrev($out); // reverse } return $out; }
Вот мой модифицированный код:
function alphaID($in, $to_num = false, $pad_up = false, $passKey = null) { $index = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $i = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); if ($passKey !== null) { // Although this function's purpose is to just make the // ID short - and not so much secure, // with this patch by Simon Franz (http://blog.snaky.org/) // you can optionally supply a password to make it harder // to calculate the corresponding numeric ID $len = strlen($index); $passhash = hash('sha256',$passKey); $passhash = (strlen($passhash) < $len) ? hash('sha512',$passKey) : $passhash; for ($n=0; $n < $len; $n++) { $p[] = substr($passhash, $n ,1); } array_multisort($p, SORT_DESC, $i); $index = implode($i); } $base = strlen($index); if ($to_num) { // Digital number <<-- alphabet letter code $in = strrev($in); $out = 0; $len = strlen($in) - 1; for ($t = 0; $t <= $len; $t++) { $bcpow = bcpow($base, $len - $t); $out = $out + strpos($index, substr($in, $t, 1)) * $bcpow; } if (is_numeric($pad_up)) { $pad_up--; if ($pad_up > 0) { $out -= pow($base, $pad_up); } } } else { // Digital number -->> alphabet letter code if (is_numeric($pad_up)) { $pad_up--; if ($pad_up > 0) { $in += pow($base, $pad_up); } } $out = ""; for ($t = floor(log10($in) / log10($base)); $t >= 0; $t--) { $a = floor($in / bcpow($base, $t)); $out = $out . substr($index, $a, 1); $in = $in - ($a * bcpow($base, $t)); } $out = strrev($out); // reverse } return $out; }
Поскольку вы не видите существенной разницы, только я удалил strlen из циклов for и сохранил его в переменной и предварительно вычислил массив для индекса (немного неуклюжий … но генерация массива – это то, что составляло основную часть вычисление).
Кредит, где его необходимо: вот оригинальная информация авторов: * @author Kevin van Zonneveld * @author Simon Franz * @copyright 2008 Кевин ван Зонневельд (kevin dot vanzonneveld dot net) * @license www dot opensource dot org / license / bsd- лицензия dot php Новая лицензия BSD * @version SVN: Release: $ Id: alphaID.inc.php 344 2009-06-10 17: 43: 59Z kevin $ * @link kevin dot vanzonneveld dot net
Я не могу опубликовать URL-адрес, поскольку у меня есть низкая репутация: S
Я сделал некоторые небольшие оптимизации, чтобы удалить некоторые дополнительные циклы процессора здесь и там. В основном такие вещи, как ненужные задания, дополнительные сравнения и т. Д. Кроме того, строки можно рассматривать как массивы, поэтому я тоже работал над этим:
function alphaID($in, $to_num = false, $pad_up = false, $passKey = null) { static $passcache; if(empty($passcache)) $passcache = array(); $index = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $i = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); if (!empty($passKey)) { // Although this function's purpose is to just make the // ID short - and not so much secure, // with this patch by Simon Franz (http://blog.snaky.org/) // you can optionally supply a password to make it harder // to calculate the corresponding numeric ID if(isset($passcache[$passKey])) $index = $passcache[$passKey]; else { if(strlen($passhash = hash('sha256',$passKey)) < strlen($index)) $passhash = hash('sha512',$passKey); $p = str_split($passhash); array_multisort($p, SORT_DESC, $i); $index = implode($i); $passcache = $index; } } $base = strlen($index); if ($to_num) { // Digital number <<-- alphabet letter code $in = strrev($in); $out = 0; $len = strlen($in) - 1; for ($t = 0; $t <= $len; $t++) { $bcpow = bcpow($base, $len - $t); $out += strpos($index, $in[$t]) * $bcpow; } if (is_numeric($pad_up)) { $pad_up--; if ($pad_up > 0) { $out -= pow($base, $pad_up); } } } else { // Digital number -->> alphabet letter code if (is_numeric($pad_up)) { $pad_up--; if ($pad_up > 0) { $in += pow($base, $pad_up); } } $out = ""; for ($t = floor(log10($in) / log10($base)); $t >= 0; $t--) { $bcp = bcpow($base, $t); $a = floor($in / $bcp); $out .= $index[$a]; $in -= $a * $bcp; } $out = strrev($out); // reverse } return $out; }
Изменить: я обновил, чтобы включить кеш. Попробуй это сейчас!
Похоже, вы неплохо справились с избыточными вызовами.
Похоже, есть пара звонков на bcpow ($ base, $ t), которые могут быть сведены к одному …
$out = ""; for ($t = floor(log10($in) / log10($base)); $t >= 0; $t--) { $newbase = bcpow($base, $t); $a = floor($in / $newbase); $out = $out . substr($index, $a, 1); $in = $in - ($a * $newbase); } $out = strrev($out); // reverse
Вероятно, вы не заметите разницы.
Я думаю, вам нужно просто создать индекс и использовать его на сайте. Позвольте мне объяснить, почему …
Хеширование и все выше $ base = strlen ($ index); просто для генерации индекса … вам придется использовать тот же $ passkey для декодирования URL-адреса. Поскольку у вас нет способа узнать, какой ключ был использован, вам придется сделать его доступным по всему сайту. Это означает, что каждый вызов для генерации URL-адреса будет использовать один и тот же ключ доступа и, таким образом, сгенерировать тот же индекс.
И поэтому … Я бы разделил код генерации индекса и сгенерировал уникальный индекс и сохранил его в переменной $ index.