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

 
sergeev:

Да. Думаю что в данном случае без хеша обойтись можно. Поспешил я с советом про хеши. :)

Если такой вариант Василия устроит - то просто загоняем в строку все параметры. Строка и будет являться идентификатором класса.


А ведь тоже верно. Ведь в данном случае криптозащита не нужна вообще. Плохо однако в этом варианте то, что все равно необходимо будет преобразовать строку всех параметров в конкретное, желательно 32-битное уникальное число, а вот для этого уже по всей видимости придется воспользоваться хэш-функциями.

Черт, а ведь в MQL нет битовых операторов типа инверсии, смещения и т.п. Да, сложнова-то будет сделать все это в MQL.

 
sergeev:

Да. в данном случае без хеша обойтись можно.
Если такой вариант Василия устроит - то просто загоняем в строку все параметры. Строка и будет являться идентификатором класса.

Ну, если реализовать джавский hash set - то еще интереснее...
Типа... соответствие hash -> sorted set -> элементы...
Главное, что с хэшем связывается сортированный список.
.
Тогда оно все еще и "летать" будет (правда, низэнько- низэнько...)
 
C-4:

Задача: требуется однозначно идентифицировать экземпляр класса по его уникальному ID, желательно по типу long. Уникальный ID должен формироваться учитывая уникальность значений переменных входящих в класс.

Млин! У меня такая же задача будет в понедельник ))))

Строку использовать не смогу, так как ограничен по длине - необходимо будет на основе этого имена объектам присваивать.

Я тут подумал... можно наверное использовать два алгоритма хэширования одновременно - это значительно уменьшит вероятность не уникальности... или сильно заблуждаюсь?

 
C-4:


Черт, а ведь в MQL нет битовых операторов типа инверсии, смещения и т.п. Да, сложнова-то будет сделать все это в MQL.

почему же нет? все есть! https://docs.mql4.com/ru/basis/operations/bit

 
C-4:

Черт, а ведь в MQL нет битовых операторов типа инверсии, смещения и т.п. Да, сложнова-то будет сделать все это в MQL.

https://docs.mql4.com/ru/basis/operations/assign
Сдвиг двоичного представления y вправо на x бит y >>= x;
Сдвиг двоичного представления y влево на x бит y <<= x;
Побитовая операция И двоичных представлений y и x y &= x;
Побитовая операция ИЛИ двоичных представлений y и x y |= x;
Побитовая операция исключающее ИЛИ
двоичных представлений y и x y ^= x;

возможно и y != x; работает

ЗЫ: по поводу уникальности имен и т.п. - задача как всегда сводится к старой проблеме: как сэкономить память и не потерять производительность

или используйте массив строк с уникальными именами, тем самым увеличиваете объем данных, или используйте ф-цию которая будет по некому алгоритму на основе входных данных формировать уникальное имя, тем самым снизите производительность, но сэкономите память

 
IgorM:
https://docs.mql4.com/ru/basis/operations/assignвозможно и y != x; работает

не там.

а вот здесь https://docs.mql4.com/ru/basis/operations/bit

 
sergeev:

не там.

а вот здесь https://docs.mql4.com/ru/basis/operations/bit


нет там! ;)

ЗЫ: это одинаковая информация, просто пример как для операции присваивания, так и для побитовых операций одинаков, т.к. написано по моей ссылке "Побитовые операции производятся только с целыми числами", если хотите, могу сказать, что у Вас точнее ссылка ;), думаю С-4 поймет откуда и куда нуно читать хэлп

 

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

//+------------------------------------------------------------------+
//|                                                Adler32_Sample.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   string a="mesage 1: Hello word";
   string b="message 2: It's simple code";
   string c="message 2: It's simple codes";
   Print(adler32(a));
   Print(adler32(b));
   Print(adler32(c));
  }
//+------------------------------------------------------------------+

ulong adler32(string buf)
  {
     ulong s1 = 1;
     ulong s2 = 0;
     uint buflength=StringLen(buf);
     uchar array[];
     ArrayResize(array, buflength,0);
     StringToCharArray(buf, array, 0, -1, CP_ACP);
     for (uint n=0; n<buflength; n++)
     {
        s1 = (s1 + array[n]) % 65521;
        s2 = (s2 + s1)     % 65521;
     }
     return ((s2 << 16) + s1);
  }

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

2011.01.22 22:50:10 BitOperations (#MCD,MN1) 2333149633
2011.01.22 22:50:10 BitOperations (#MCD,MN1) 2169506126
2011.01.22 22:50:10 BitOperations (#MCD,MN1) 1202325230

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

 
C-4:

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

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

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

здорово.

если можно (чтоб не потерять) закиньте в кодебазе MQL5.

 
sergeev:

здорово.

если можно (чтоб не потерять) закиньте в кодебазе MQL5.


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