Cualquier pregunta de un PROFI a un SUPER PROFI - 1. - página 8

 
C-4:

Aquí hay un ejemplo de funcionamiento de la función hash de Adler32:

El código básico de la función está tomado de la wikipedia y ligeramente modificado para MQL5. Este es el resultado del script:

Como puede ver, todos los valores devueltos por esta función son absolutamente diferentes, aunque las cadenas en sí no difieren mucho.

¿Por qué ulong y no uint?

Y las operaciones con arrays en esta función son extremadamente ineficientes. Es más fácil modificar el código y dividir el unicode en dos símbolos independientes: será 50 veces más 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 frente a 13822 ms a 3 millones de carreras.... sólo 4 veces diferente...... pero sin pérdida de conversión
 

Sí, así es, porque 32 bits es un entero, no un long. Aunque, francamente, yo modificaría la función hash para la versión de 64 bits. Después de todo, la probabilidad de colisión es menor, y es fácil de ajustar para el experto en magia. Aunque, por otro lado, la implementación actual es totalmente compatible con MQL4 (pues no tiene tipo largo)

P.D. ¿No sería más rápido, si convierto la cadena a un array uchar antes de hacer el bucle, y ya en el bucle ir uno a uno a través de los valores del array? Pero creo que llamar a StringGetCharacter(buf, n) cada vez en el bucle es demasiado caro.

 
C-4:

Sí, así es, porque 32 bits es un entero, no un long. Aunque, francamente, yo modificaría la función hash para la versión de 64 bits. Después de todo, la probabilidad de colisión es menor, y es fácil de ajustar para el experto en magia. Sin embargo, por otro lado, la implementación actual es totalmente compatible con MQL4 (pues no tiene tipo largo)

P.D. ¿No sería más rápido, si convierto la cadena a un array uchar antes del bucle, y luego en el bucle tengo que recorrer los valores del array uno por uno? Aun así, creo que llamar a StringGetCharacter(buf, n) cada vez en el bucle es demasiado caro.

Entiendo que este algoritmo sólo puede ser de 32 bits.

¿Y qué pasa con la conversión antes del bucle, cómo? Entonces necesitarías una matriz... asignación dinámica... Sí y hay una pérdida de información al convertir

 
AlexSTAL:

Entiendo que este algoritmo sólo puede ser de 32 bits.

Más concretamente, para cada longitud de bloque, tenemos que seleccionar específicamente un polinomio característico que tenga "buenas" propiedades de hashing, es decir, que mapee más o menos uniformemente el conjunto de entrada al conjunto de hash.
 
AlexSTAL:
3681 ms frente a 13822 ms a 3 millones de carreras.... sólo 4 veces diferente...... pero sin pérdida de conversión

sería aún más rápido si la operación dat % 256 se sustituye por dat & 0xFF, y s = (...)%65521 ; descomponer a s = (...); if(s>=65521) s-=65521;


 

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

Así que esta es la conversión regular antes del ciclo:

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

Pero de nuevo, esta función sólo está disponible en MQL5. La pérdida de información, según tengo entendido, se produce en Unicode-->ASCII, lo cual es bastante aceptable.

 
C-4:

Así que esta es la conversión regular antes del ciclo:

Pero de nuevo, esta función sólo está disponible en MQL5. La pérdida de información, según tengo entendido, se produce en Unicode-->ASCII, lo cual es bastante aceptable.

Bueno, sí... Sólo es aceptable para usted en su tarea particular, mientras que no para el algoritmo.

Mira de cerca el algoritmo MaHash8v64 (ulong) de 64 bits, o quizás los dos juntos (al menos, yo lo haré por mí).

No hay Unicode en MQL4, así que tampoco hay problema.

P.D. StringGetCharacter es una función bastante rápida, sólo devuelve WORD(ushort para MQL5) desde la posición requerida, es decir, no funciona con string en absoluto

 

Si alguien tiene un proyecto de aplicación C++ windows VS, preferiblemente para la versión 10. El proyecto necesita utilizar una dll en su trabajo. Lo utilizaré como plantilla.

Preferiblemente la dll debería llamarse MLP2HL.dll.

Gracias de antemano.

 
joo:

Si alguien tiene un proyecto de aplicación C++ windows VS, preferiblemente para la versión 10. El proyecto necesita utilizar una dll en su trabajo. Lo utilizaré como plantilla.

Preferiblemente la dll debería llamarse MLP2HL.dll.

Gracias de antemano.

La plantilla se encuentra aquí: ...MetaTrader 4\Nmuestras

VS 2010 lo convierte automáticamente. El nombre se puede cambiar.
 
Zhunko:

La plantilla se encuentra aquí: ...MetaTrader 4\\Nsuperficies\Nmuestras

VS 2010 lo convierte automáticamente. El nombre se puede cambiar.

No, ya sé lo de la plantilla dll. :)

Necesito una plantilla de proyecto exe que contenga en ella las fuentes de la dll, para poder depurarla. Una dll no es ejecutable y debe ser llamada por alguien. He decidido estudiar Intel Parallel Studio 2011 para VS.

Razón de la queja: