Показать сообщение отдельно

3.4 запроса на получение цифрового символа (0-9)
  #9  
Старый 25.06.2009, 18:32
Аватар для Grey
Grey
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..
 
Ответить с цитированием