Использование y_stringhash
Здравствуйте, ув. пользователи Pro-Pawn.ru
Сегодня я расскажу вам об использовании инклуда y_stringhash. Этот инклуд предназначен для вычисления хеш-суммы из строк, причём возможно вычисление хеша на этапе компиляции скрипта.
Хеш-сумма - это результат обработки массива данных (в нашем случае - строки), который представляет собой целое число.
Как известно, операции по сравнению чисел проходят гораздо быстрее, чем сравнения строк (strcmp), поэтому, если одна и та же строка сравнивается несколько раз, strcmp можно заменить вычислением хеша и его последующим сравнением.
Пример:
Старый код:
PHP код:
if(strcmp(string, "Pro") == 0)
{
// ...
}
else if(strcmp(string, "Pawn") == 0)
{
// ...
}
Новый код:
PHP код:
switch(YHash(string, false, hash_fnv1))
{
case _I@f<Pro>:
{
// ...
}
case _I@f<Pawn>:
{
// ...
}
}
P.S.: В данном уроке используется не совсем стандартный способ, т.к. стандартный метод (YHash(str) и _I<str>) с некоторыми символами работает неправильно и часто выдаёт коллизии.
Функции инклуда:- YHash - возвращает хеш-сумму заданной строки. Рекомендуется к использованию со строками, значение которых не известно во время компиляции (например, cmdtext в OnPlayerCommandText).
Синтаксис:
PHP код:
YHash(str[], bool:sensitive=true, e_HASH_TYPE:type=hash_bernstein);
- str - строка, хеш которой следует получить.
- sensitive - чувствительность к регистру. Если параметр будет иметь значение false, хеш из строки "Pawn" будет совпадать с хешем из "PAWN", "pawn" и т.п. По умолчанию имеет значение true.
- type - алгоритм хеширования. По умолчанию используется хеш "bernstein", однако с ним велика вероятность коллизий, потому рекомендуется использовать алгоритмы "fnv1" и "fnv1a".
- _H - макрос для вычисления хешей из строк, значение которых известно во время компиляции. Данная версия чувствительна к регистру: _H<Pawn> и _H<pawn> дадут разные результаты.
Поскольку алгоритм "bernstein" сравнительно часто выдаёт коллизии, рекомендуются альтернативы, в которых используются алгоритмы "fnv1" и "fnv1a" - макросы _H@f и _H@a соответственно (см. пример использования в начале статьи).
Внимание! Макрос не работает с русскими буквами и многими другими символами.
Список всех разрешённых символов:
PHP код:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_
В данный список входят все латинские буквы, цифры, пробел и знак подчёркивания. Остальные символы использовать нельзя.
- _I - то же самое, что и _H, однако результаты не чувствительны к регистру: _I<Pawn> и _I<pawn> будут совпадать.
По уже описанной выше причине, рекомендуется использовать альтернативные варианты _I@f и _I@a.
Установка:- Инклуд y_stringhash является частью библиотеки YSI.
Скачать самую последнюю версию можно здесь:
- Скачав архив, извлеките из него папку "pawno" в папку с вашим модом.
- В самое начало скрипта ко всем инклудам добавьте:
PHP код:
#include <YSI\y_stringhash>
- ...
- PROFIT :trollface:
Автор инклуда: Y_Less
Статью подготовил: Daniel_Cortez
При написании статьи использовались примеры из статьи: http://forum.sa-mp.com/showthread.php?t=169354
Копирование данной статьи на других ресурсах без разрешения автора запрещено!