Любые вопросы от ПРОФИ к СУПЕРПРОФИ - 1. - страница 8

 
C-4:

Вот накатал тут рабочий пример хеш-функции Adler32:

Основной код функции взят из википедии и незначительно изменен под MQL5. Вот результат работы скрипта:

Как видно все значения выдаваемые функцией обсолютно разные, хотя сами строки различаются не сильно.

А почему ulong, а не uint ?

И операция с массивами в данной функции крайне не эффективны. Проще модернизировать код и раскладывать unicode на два независимых символа - будет раз в 50 быстрее

uint adler32__(string buf)
  {
     uint s1 = 1;
     uint s2 = 0;
     uint buflength=StringLen(buf);
     ushort dat;
     for (uint n=0; n<buflength; n++)
     {
        dat = StringGetCharacter(buf, n);
        s1 = (s1 + (dat % 256)) % 65521;
        s2 = (s2 + s1)     % 65521;
        s1 = (s1 + (dat>>8)) % 65521;
        s2 = (s2 + s1)     % 65521;
     }
     return ((s2 << 16) + s1);
  }
3681 мс против 13822 мс при 3-х миллионном прогоне.... разница всего в 4 раза...... но зато никаких потерь при преобразовании
 

Да, точно, ведь 32 бита - это integer а не long. Хотя, если честно, я бы все же переделал хеш-функцию под 64 битную версию. Все-же вероятность коллизии вроде меньше, да и под magic эксперта легко подстроить. Хотя, с другой стороны текущая реализация полностью совместима с MQL4 (ведь в нем нет типа long)

P.S. А не будет ли быстрее, если сконвертировать string в uchar array перед циклом, а уже в цикле последовательно переберать значения array? Все же я думаю вызывать каждый раз StringGetCharacter(buf, n) в цикле весьма накладно.

 
C-4:

Да, точно, ведь 32 бита - это integer а не long. Хотя, если честно, я бы все же переделал хеш-функцию под 64 битную версию. Все-же вероятность коллизии вроде меньше, да и под magic эксперта легко подстроить. Хотя, с другой стороны текущая реализация полностью совместима с MQL4 (ведь в нем нет типа long)

P.S. А не будет ли быстрее, если сконвертировать string в uchar array перед циклом, а уже в цикле последовательно переберать значения array? Все же я думаю вызывать каждый раз StringGetCharacter(buf, n) в цикле весьма накладно.

Я так понимаю, что этот алгоритм может быть только 32-битным.

А по поводу конвертации перед циклом - это как? Вам массив тогда понадобится... динамическое распределение... Да и при конвертации происходит потеря информации

 
AlexSTAL:

Я так понимаю, что этот алгоритм может быть только 32-битным.

Точнее сказать, для каждой длины блока надо специально подбирать характеристический многочлен, который будет обладать "хорошими" хеширующими свойствами, т.е. более-менее равномерно отображать входное множество на множество хешей.
 
AlexSTAL:
3681 мс против 13822 мс при 3-х миллионном прогоне.... разница всего в 4 раза...... но зато никаких потерь при преобразовании

еще быстрее будет, если операцию dat % 256 заменить на dat & 0xFF, а s = (...)%65521; разложить на s = (...); if(s>=65521) s-=65521;


 

А по поводу конвертации перед циклом - это как? Вам массив тогда понадобится... динамическое распределение... Да и при конвертации происходит потеря информации

Так вот штатная конвертация перед циклом:

uchar array[];
ArrayResize(array, buflength,0);
StringToCharArray(buf, array, 0, -1, CP_ACP);
// Дальше идет цикл

Правда, опять-таки, эта функция есть только в MQL5. А потеря информации как я понимаю происходит при Unicode-->ASCII, что вполне приемлемо.

 
C-4:

Так вот штатная конвертация перед циклом:

Правда, опять-таки, эта функция есть только в MQL5. А потеря информации как я понимаю происходит при Unicode-->ASCII, что вполне приемлемо.

Ну да... только это для Вас в Вашей конкретной задаче приемлемо, а для алгоритма нет.

Приглядитесь лучше к 64-битному алгоритму MaHash8v64 (ulong), а лучше наверное одновременно к двум в связке (по крайней мере я у себя так сделаю)

А в MQL4 нет Юникод, нет и проблемы...

P.S. StringGetCharacter - это достаточно быстрая функция, она всего лишь возвращает WORD (ushort для MQL5) из нужной позиции, т.е. не работает со строкой вообще

 

Если у кого проект С++ windows приложения VS, желательно для 10-й версии. Нужно что бы проект использовал в работе dll. Буду использовать в качестве шаблона.

Желательно, что бы dll называлась MLP2HL.dll.

Заранее спасибо.

 
joo:

Если у кого проект С++ windows приложения VS, желательно для 10-й версии. Нужно что бы проект использовал в работе dll. Буду использовать в качестве шаблона.

Желательно, что бы dll называлась MLP2HL.dll.

Заранее спасибо.

Шаблон есть здесь: ...\MetaTrader 4\experts\samples\DLLSample

VS 2010 его автоматически преобразует. Имя можно поменять.
 
Zhunko:

Шаблон есть здесь: ...\MetaTrader 4\experts\samples\DLLSample

VS 2010 его автоматически преобразует. Имя можно поменять.

Не, я про этот шаблончик dll знаю. :)

Мне нужен шаблон проекта exe, проект которого содержит в себе исходники dll, что бы можно было dll отлаживать. dll ведь не исполняемый и его должен кто то вызывать. Решил вот изучить Intel Parallel Studio 2011 для VS.

Причина обращения: