Qualsiasi domanda da un PROFI a un SUPER PROFI - 1. - pagina 8

 
C-4:

Ecco un esempio funzionante della funzione hash Adler32:

Il codice di base della funzione è preso da wikipedia e leggermente modificato per MQL5. Ecco il risultato dello script:

Come potete vedere, tutti i valori restituiti da questa funzione sono assolutamente diversi, anche se le stringhe stesse non differiscono molto.

Perché ulong e non uint?

E le operazioni con gli array in questa funzione sono estremamente inefficienti. È più facile modificare il codice e dividere l'unicode in due simboli indipendenti - sarà 50 volte più veloce.

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 milioni di corse.... solo 4 volte diverso...... ma nessuna perdita di conversione
 

Sì, è vero, perché 32 bit è un intero, non un lungo. Anche se, francamente, modificherei la funzione hash per la versione a 64 bit. Dopo tutto, la probabilità di collisione è minore, ed è facile da regolare per l'esperto di magia. Anche se, d'altra parte, l'implementazione attuale è pienamente compatibile con MQL4 (perché non ha un tipo lungo)

P.S. Non sarebbe più veloce, se convertissi la stringa in array uchar prima del looping, e già nel loop uno per uno passassi attraverso i valori dell'array? Ma penso che chiamare StringGetCharacter(buf, n) ogni volta nel ciclo sia troppo costoso.

 
C-4:

Sì, è vero, perché 32 bit è un intero, non un lungo. Anche se, francamente, modificherei la funzione hash per la versione a 64 bit. Dopo tutto, la probabilità di collisione è minore, ed è facile da regolare per l'esperto di magia. Tuttavia, d'altra parte, l'attuale implementazione è pienamente compatibile con MQL4 (perché non ha un tipo lungo)

P.S. Non sarebbe più veloce se convertissi la stringa in array uchar prima del ciclo, e poi nel ciclo dovessi passare attraverso i valori dell'array uno per uno? Ancora, penso che chiamare StringGetCharacter(buf, n) ogni volta nel ciclo sia troppo costoso.

Ho capito che questo algoritmo può essere solo a 32 bit.

E che dire della conversione prima del ciclo - come? Avreste quindi bisogno di un array... allocazione dinamica... Sì e c'è una perdita di informazioni durante la conversione

 
AlexSTAL:

Ho capito che questo algoritmo può essere solo a 32 bit.

Più precisamente, per ogni lunghezza di blocco, dobbiamo selezionare specificamente un polinomio caratteristico che avrà "buone" proprietà di hashing, cioè mappare più o meno uniformemente l'insieme di input all'insieme di hash.
 
AlexSTAL:
3681 ms vs 13822 ms a 3 milioni di corse.... solo 4 volte diverso...... ma nessuna perdita di conversione

sarebbe ancora più veloce se l'operazione dat % 256 è sostituita da dat & 0xFF, e s = (...)%65521; decomporre in s = (...); if(s>=65521) s-=65521;


 

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

Quindi questa è la conversione regolare prima del ciclo:

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

Ma di nuovo, questa funzione è disponibile solo in MQL5. La perdita di informazioni, da quanto ho capito, avviene in Unicode-->ASCII, che è abbastanza accettabile.

 
C-4:

Quindi questa è la conversione regolare prima del ciclo:

Ma di nuovo, questa funzione è disponibile solo in MQL5. La perdita di informazioni, come ho capito, avviene in Unicode-->ASCII, che è abbastanza accettabile.

Beh, sì... È accettabile solo per voi nel vostro particolare compito, mentre non per l'algoritmo.

Date un'occhiata più da vicino all'algoritmo MaHash8v64 (ulong) a 64 bit, o forse entrambi insieme (almeno, io lo farò per me).

Non c'è Unicode in MQL4, quindi non c'è nemmeno un problema.

P.S. StringGetCharacter è una funzione piuttosto veloce, restituisce solo WORD(ushort per MQL5) dalla posizione richiesta, cioè non funziona affatto con le stringhe

 

Se qualcuno ha un progetto di applicazione C++ windows VS, preferibilmente per la versione 10. Il progetto ha bisogno di utilizzare un dll nel suo lavoro. Lo userò come modello.

Preferibilmente la dll dovrebbe essere chiamata MLP2HL.dll.

Grazie in anticipo.

 
joo:

Se qualcuno ha un progetto di applicazione C++ windows VS, preferibilmente per la versione 10. Il progetto ha bisogno di utilizzare un dll nel suo lavoro. Lo userò come modello.

Preferibilmente la dll dovrebbe essere chiamata MLP2HL.dll.

Grazie in anticipo.

Il modello è qui: ...MetaTrader 4\experts\samples\DLLSample

VS 2010 lo convertirà automaticamente. Il nome può essere cambiato.
 
Zhunko:

Il modello è qui: ...MetaTrader 4\esperti_campioni\DLLSample

VS 2010 lo converte automaticamente. Il nome può essere cambiato.

No, so del modello dll. :)

Ho bisogno di un modello di progetto exe che contenga i sorgenti della dll, in modo che io possa fare il debug. Una DLL non è eseguibile e deve essere chiamata da qualcuno. Ho deciso di studiare Intel Parallel Studio 2011 per VS.