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

 
sergeev:

Sì, penso che possiamo fare a meno dell'hashish in questo caso. Sono stato troppo frettoloso con i miei consigli sugli hash. :)

Se questa opzione va bene a Vasily - metteremo semplicemente tutti i parametri in una stringa. La stringa sarà l'identificatore della classe.


Ma è anche corretto. Dopo tutto, in questo caso la protezione crittografica non è affatto necessaria. La cosa brutta, però, è che avete ancora bisogno di convertire la stringa di tutti i parametri in un numero specifico, preferibilmente unico a 32 bit, e per questo probabilmente avrete bisogno di usare funzioni hash.

Diavolo, MQL non ha operatori bitwise come l'inversione, l'offset, ecc. Sì, è un po' difficile fare tutto questo in MQL.

 
sergeev:

Sì, in questo caso possiamo fare a meno dell'hashish.
Se questa variante è adatta a Vasiliy, allora mettiamo tutti i parametri in una stringa. La stringa sarà l'identificatore della classe.

Beh, se si implementa l'hash set java, sarà ancora più interessante...
Come... hash corrispondente -> insieme ordinato -> elementi...
La cosa principale è che una lista ordinata è associata all'hash.
.
Allora anche tutto "volerà" (anche se, basso, basso...).
 
C-4:

Problema: è necessario identificare univocamente un'istanza di una classe tramite il suo ID unico, preferibilmente di tipo lungo. L'ID unico dovrebbe essere formato considerando l'unicità dei valori delle variabili appartenenti alla classe.

Accidenti! Avrò lo stesso compito lunedì )))).

Non sarò in grado di usare una stringa, poiché sono limitato dalla lunghezza - avrò bisogno di nominare gli oggetti in base ad essa.

Stavo pensando... Probabilmente puoi usare due algoritmi di hashing allo stesso tempo - ridurrà notevolmente la probabilità di non unicità... o mi sbaglio?

 
C-4:


Diavolo, MQL non ha operatori bitwise come l'inversione, l'offset, ecc. Sì, sarà difficile fare tutto questo in MQL.

Perché no? È tutto lì! https://docs.mql4.com/ru/basis/operations/bit

 
C-4:

Diavolo, MQL non ha operatori bitwise come l'inversione, l'offset, ecc. Sì, sarebbe difficile fare tutto questo in MQL.

https://docs.mql4.com/ru/basis/operations/assign
Spostare la rappresentazione binaria di y a destra di x bit y >>= x;
Sposta la rappresentazione binaria di y a sinistra di x bit y <<= x;
Operazione bitwise AND delle rappresentazioni binarie di y e x y &= x;
OR bitwise di rappresentazioni binarie y e x y |= x;
Operazione OR esclusivo bitwise
di rappresentazioni binarie y e x y ^= x;

Forse y != x; funziona anche

SZY: sull'unicità dei nomi ecc. - il problema, come sempre, si riduce al vecchio problema: come risparmiare memoria e non perdere prestazioni

utilizzare un array di stringhe con nomi unici e quindi aumentare la quantità di dati, o utilizzare una funzione che utilizzerà un algoritmo basato sui dati di input per formare un nome unico, riducendo così le prestazioni ma risparmiando memoria

 


non lì! ;)

SZY: queste informazioni sono le stesse, solo l'esempio sia per l'assegnazione che per le operazioni bitwise è lo stesso, perché il mio link dice "Le operazioni bitwise sono eseguite solo con gli interi", se vuoi posso dirti il link esatto ;), penso che C-4 capirà dove e come leggere l'Aiuto

 

Ecco un esempio funzionante della funzione hash 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);
  }

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

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

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

 
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 del lavoro dello script:

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

grande.

se potete (per non perderlo) lasciatelo nel codebase di MQL5.

 
sergeev:

grande.

se potete (per non perderlo) lasciatelo nel codebase di MQL5.


Okie.