|
AMA - Level 2
Регистрация: 10.06.2006
Сообщений: 1,113
Провел на форуме: 17668503
Репутация:
5826
|
|
3.4 запроса на получение цифрового символа (0-9)
3.4 запроса на получение цифрового символа (0-9)
Продолжая заниматься оптимизацией своего скрипта до шёл до такой обыденной штуковины, как определение длины возвращаемой строки.
До этого момента использовал функцию для быстрой выдерки хешей (эта которая работает с символами 0-9a-f), задумался насколько это разумно - с одной стороны использовать меньший диапазон нельзя - там всего 8 символов, а у нас 10 (ведь работая с длиной мы получаем только цифры), а с другой выходит, что есть лишние проверки.
Посмотрел как выглядят ascii коды нужных символов и вот, что получилось:
S AS BIN
0 48 110000
1 49 110001
2 50 110010
3 51 110011
4 52 110100
5 53 110101
6 54 110110
7 55 110111
8 56 111000
9 57 111001
================================
substring(conv(ascii(substring(...),5,1)),10,2)=1
$s[4] = 1; || $s[4] = 0;
$s[2] = 0; ||
================================
substring(conv(ascii(substring(...),4,1)),10,2)=1
$s[3] = 1; || $s[3] = 0;
$s[2] = 0; ||
================================
substring(conv(ascii(substring(...),6,1)),10,2)=1
$s[5] = 1; || $s[5] = 0;
================================
а этот запрос если нужен
substring(conv(ascii(substring(...),3,1)),10,2)=1
$s[2] = 1; || $s[2] = 0;
================================
Таким образом для 6 из 10 символов нужно всего 3 запроса, т.е. в среднем 3.4 запроса на символ.
Сделал функцию:
PHP код:
function grey_f3_digit($query, $i) {
$sa = array();
for($j = 6; $j > 3; $j--) {
if(grey_f1(' and substring(conv(ascii(substring('.$query.','.$i.',1)),10,2),'.$j.',1)=1') == 1) {
$sa[$j-3] = 1;
} else {
$sa[$j-3] = 0;
}
}
if(($sa[1] == 1) || ($sa[2] == 1)) {
$sa[0] = 0;
} else {
if(grey_f1(' and substring(conv(ascii(substring('.$query.','.$i.',1)),10,2),3,1)=1') == 1) {
$sa[0] = 1;
} else {
$sa[0] = 0;
}
}
$s = (int) '11'.$sa[0].$sa[1].$sa[2].$sa[3];
$s = chr(base_convert($s,2,10));
return $s; }
Конечно прирост не значительный, но лишнем не будет.
Последний раз редактировалось Grey; 05.07.2009 в 17:23..
|