Qualquer pergunta de um PROFI para um SUPER PROFI - 1. - página 8

 
C-4:

Aqui está um exemplo de funcionamento da função hash Adler32:

O código básico da função é retirado da wikipedia e ligeiramente modificado para MQL5. Aqui está o resultado do roteiro:

Como você pode ver, todos os valores retornados por esta função são absolutamente diferentes, embora as próprias cordas não sejam muito diferentes.

Por que ulong e não uint?

E as operações com matrizes nesta função são extremamente ineficientes. É mais fácil modificar o código e dividir unicode em dois símbolos independentes - será 50 vezes mais rápido.

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 ms vs 13822 ms a 3 milhões de corridas.... apenas 4 vezes diferente...... mas sem perda de conversão
 

Sim, isso mesmo, porque 32 bits é um número inteiro, não um longo. Embora, francamente falando, eu modificaria a função hash para a versão de 64 bits. Afinal de contas, a probabilidade de colisão é menor, e é fácil de ajustar para o especialista mágico. Embora, por outro lado, a implementação atual seja totalmente compatível com a MQL4 (pois não tem tipo longo)

P.S. Não seria mais rápido, se eu convertesse a string em uchar array antes do looping, e já em loop, um por um, passar pelos valores da array? Mas eu acho que chamar StringGetCharacter(buf, n) cada vez no loop é muito caro.

 
C-4:

Sim, isso mesmo, porque 32 bits é um número inteiro, não um longo. Embora, para ser honesto, eu ainda mudaria a função hash para a versão de 64 bits. Afinal de contas, a probabilidade de colisão é menor, e é fácil de ajustar para o especialista mágico. No entanto, por outro lado, a implementação atual é totalmente compatível com a MQL4 (pois não tem tipo longo)

P.S. Não seria mais rápido, se eu convertesse a string em uchar array antes do loop, e depois em loop eu tenho que passar pelos valores da array um por um? Ainda assim, acho que chamar StringGetCharacter(buf, n) cada vez no laço é bastante caro.

Entendo que este algoritmo pode ser de 32 bits.

E quanto à conversão antes do loop - como? Você precisaria então de uma matriz... alocação dinâmica... Sim e há uma perda de informação quando se converte

 
AlexSTAL:

Entendo que este algoritmo pode ser de 32 bits.

Mais precisamente, para cada comprimento de bloco, temos que selecionar especificamente um polinômio característico que terá "boas" propriedades de hashing, ou seja, mapear mais ou menos uniformemente o conjunto de entrada para o conjunto de hash.
 
AlexSTAL:
3681 ms vs 13822 ms a 3 milhões de corridas.... apenas 4 vezes diferente...... mas sem perda de conversão

seria ainda mais rápido se dat % 256 operação fosse substituída por dat & 0xFF, e s = (...)%65521; decompor por s = (...); if(s>=65521) s-=65521;


 

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

Portanto, esta é a conversão regular antes do ciclo:

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

Mas novamente, esta função só está disponível na MQL5. A perda de informações, como eu entendo, ocorre em Unicode->ASCII, o que é bastante aceitável.

 
C-4:

Portanto, esta é a conversão regular antes do ciclo:

Mas novamente, esta função só está disponível na MQL5. A perda de informações, como eu entendo, ocorre em Unicode->ASCII, o que é bastante aceitável.

Bem, sim... Só é aceitável para você em sua tarefa específica, embora não para o algoritmo.

Veja mais de perto o algoritmo MaHash8v64 (ulong) de 64 bits, ou talvez os dois juntos (pelo menos, eu o farei por mim).

Não há Unicode na MQL4, portanto, também não há problema.

P.S. StringGetCharacter é uma função bastante rápida, ele só retorna WORD(ushort para MQL5) da posição requerida, ou seja, não funciona com string em absoluto

 

Se alguém tiver um projeto de aplicação VS com janelas C++, de preferência para a versão 10. O projeto precisa utilizar uma dll em seu trabalho. Vou usá-lo como um modelo.

De preferência a dll deve ser chamada MLP2HL.dll.

Obrigado de antemão.

 
joo:

Se alguém tiver um projeto de aplicação VS com janelas C++, de preferência para a versão 10. O projeto precisa utilizar uma dll em seu trabalho. Vou usá-lo como um modelo.

De preferência a dll deve ser chamada MLP2HL.dll.

Agradecemos antecipadamente.

O modelo está aqui: ...amostra do MetaTrader 4\\ amostra doDLLS

A VS 2010 a converte automaticamente. O nome pode ser mudado.
 
Zhunko:

O modelo está aqui: ...amostra do MetaTrader 4\\ amostra doDLLS

A VS 2010 o converte automaticamente. O nome pode ser mudado.

Nah, eu sei sobre o modelo dll. :)

Eu preciso de um modelo de projeto exe que contenha nele as fontes da dll, para que eu possa depurá-lo. Uma dll não é executável e deve ser chamada por alguém. Decidi estudar o Intel Parallel Studio 2011 para a VS.

Razão: