Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 10 из 10
  1. #1
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±

    Использование y_stringhash

    Здравствуйте, ув. пользователи Pro-Pawn.ru
    Сегодня я расскажу вам об использовании инклуда y_stringhash. Этот инклуд предназначен для вычисления хеш-суммы из строк, причём возможно вычисление хеша на этапе компиляции скрипта.
    Хеш-сумма - это результат обработки массива данных (в нашем случае - строки), который представляет собой целое число.
    Как известно, операции по сравнению чисел проходят гораздо быстрее, чем сравнения строк (strcmp), поэтому, если одна и та же строка сравнивается несколько раз, strcmp можно заменить вычислением хеша и его последующим сравнением.

    Пример:

    Старый код:
    PHP код:
        if(strcmp(string"Pro") == 0)
        {
            
    // ...
        
    }
        else if(
    strcmp(string"Pawn") == 0)
        {
            
    // ...
        

    Новый код:
    PHP код:
        switch(YHash(stringfalsehash_fnv1))
        {
            case 
    _I@f<Pro>:
            {
                
    // ...
            
    }
            case 
    _I@f<Pawn>:
            {
                
    // ...
            
    }
        } 
    P.S.: В данном уроке используется не совсем стандартный способ, т.к. стандартный метод (YHash(str) и _I<str>) с некоторыми символами работает неправильно и часто выдаёт коллизии.

    Функции инклуда:
    • YHash - возвращает хеш-сумму заданной строки. Рекомендуется к использованию со строками, значение которых не известно во время компиляции (например, cmdtext в OnPlayerCommandText).
      Синтаксис:
      PHP код:
      YHash(str[], bool:sensitive=truee_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.


    Установка:
    1. Инклуд y_stringhash является частью библиотеки YSI.
      Скачать самую последнюю версию можно здесь:
    2. Скачав архив, извлеките из него папку "pawno" в папку с вашим модом.
    3. В самое начало скрипта ко всем инклудам добавьте:
      PHP код:
      #include <YSI\y_stringhash> 
    4. ...
    5. PROFIT


    Автор инклуда: Y_Less
    Статью подготовил: Daniel_Cortez
    При написании статьи использовались примеры из статьи: http://forum.sa-mp.com/showthread.php?t=169354

    Специально для Pro-Pawn.ru
    Копирование данной статьи на других ресурсах без разрешения автора запрещено!
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  2. 8 пользователя(ей) сказали cпасибо:
    #Vito (26.03.2014) DeimoS (26.03.2014) kushichka (10.07.2016) L0ndl3m (26.03.2014) Osetin (26.03.2014) Salvacore (26.03.2014) ^_^ (26.03.2014) Пельмень (11.05.2014)
  3. #2
    Аватар для Salvacore
    Инжунер-погромист

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Адрес
    Аҧсуа бызшәа
    Сообщений
    2,271
    Репутация:
    418 ±
    Спасибо:3

  4. #3
    Аватар для #Vito
    #define

    Статус
    Оффлайн
    Регистрация
    14.09.2013
    Адрес
    Одесса
    Сообщений
    129
    Репутация:
    38 ±
    Пригодится, спасибо :)
    Skype: vitya.saveliev


  5. #4
    Аватар для Kenny_Dalglish
    Заблокирован

    Статус
    Оффлайн
    Регистрация
    24.02.2014
    Сообщений
    179
    Репутация:
    -1 ±
    C:\Users\Danil\Desktop\Дани\Дани\Inspire DeathMatch [0.3z]\pawno\include\YSI/y_stringhash.inc(70) : fatal error 100: cannot read from file: "internal\y_version"
    Последний раз редактировалось Daniel_Cortez; 15.04.2014 в 14:22. Причина: прекратите цитировать длинные посты, по 100 раз перелистывать после вас приходится! //DC

  6. #5
    Аватар для Spectrum
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.04.2014
    Адрес
    Omsk, Russia
    Сообщений
    349
    Репутация:
    49 ±
    Цитата Сообщение от Kenny_Dalglish Посмотреть сообщение
    C:\Users\Danil\Desktop\Дани\Дани\Inspire DeathMatch [0.3z]\pawno\include\YSI/y_stringhash.inc(70) : fatal error 100: cannot read from file: "internal\y_version"
    инклуд не найден в папке

  7. #6
    Аватар для Kenny_Dalglish
    Заблокирован

    Статус
    Оффлайн
    Регистрация
    24.02.2014
    Сообщений
    179
    Репутация:
    -1 ±
    Цитата Сообщение от Spectrum Посмотреть сообщение
    инклуд не найден в папке
    Это я знаю. Но и где мне его взять я скачал по ссылку

  8. #7
    Аватар для A N D R E Y
    Пользователь

    Статус
    Оффлайн
    Регистрация
    07.12.2013
    Сообщений
    149
    Репутация:
    14 ±
    Цитата Сообщение от Kenny_Dalglish Посмотреть сообщение
    Это я знаю. Но и где мне его взять я скачал по ссылку
    Создайте папку YSI в папке пано и киньте туда скачанный файл и компильте, и будет счастье.

  9. #8
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Думал создать тему, но один комментарий, думаю, даст однозначный ответ. Как думаешь, есть профит в использовании подобного рода мазахозма?

    PHP код:
    #include <a_samp>
    #include "YSI_Coding\y_stringhash"

    enum E_PLAYER_INFO {
        
    playername,
        
    level,
        
    money
    };

    new 
    person_info[5][E_PLAYER_INFO] = {
        {
    _H@f<Tony>, 12000},
        {
    _H@f<Desulaid>, 51200},
        {
    _H@f<Untonyst>, 370000},
        {
    _H@f<Darge>, 28000},
        {
    _H@f<Leex>, 411040}
    };

    #define Hash_GetPlayerMoney(%0,"%1") __Hash_GetPlayerMoney(%0,_H@f<%1>)
    stock __Hash_GetPlayerMoney(const pstrict[5][E_PLAYER_INFO], name) {
        for (new 
    i10i++) {
            if (
    pstrict[i][playername] == name) {
                return 
    pstrict[i][money];
            }
        }
        return -
    1;
    }

    main()
    {
        
    printf("%d"Hash_GetPlayerMoney(person_info"Tony"));

    Пока я нашел пару минусов (в плане организации кода):
    • Надо под каждый элемент "структуры" писать свою функцию, где код шаблонный. Возможно, как-нибудь можно унифицировать это, но я писал на скорую руку ради интереса, да и вряд ли мне язык это позволит сделать без извращений.
    • Столько будет одинаковых итераций... А если к ним приложить игроков в сети. Как вариант, я думаю, можно прикрутить это к итераторам. Возможно(!?!) даже от шаблонности можно будет избавиться.

  10. #9
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Надеюсь, это была просто шутка.
    Но если всё-таки нет, то разве не проще сделать проверку на уровень админки (pAdmin)? Всяко же лучше, чем хардкодить список имён, который ещё время от времени нужно обновлять.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  11. #10
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Надеюсь, это была просто шутка.
    Но если всё-таки нет, то разве не проще сделать проверку на уровень админки (pAdmin)? Всяко же лучше, чем хардкодить список имён, который ещё время от времени нужно обновлять.
    Блин, я был пьян и не помню этого xD

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •