从专业人员到超级专业人员的任何问题 - 1。 - 页 7

 
sergeev:

是的,我认为在这种情况下我们可以不使用哈希。我对哈希值的建议过于草率。:)

如果这个选项适合Vasily--我们将简单地把所有参数放入字符串。这个字符串将是类的标识符。


但这也是正确的。毕竟,在这种情况下,根本不需要加密保护。然而,不好的是,你仍然需要将所有参数的字符串转换成一个具体的、最好是32位的唯一数字,为此你可能需要使用哈希函数。

该死的,在MQL中没有像反转、偏移等位操作符。是的,在MQL中做这些事有点难。

 
sergeev:

是的,在这种情况下,我们可以不使用哈希值。
如果这个变体适合Vasiliy,那么我们就把所有的参数放入字符串中。这个字符串将是类的标识符。

好吧,如果你实现了java哈希集,那就更有意思了......
就像...匹配的哈希->排序的集合->元素...
最主要的是,一个排序的列表与哈希值相关。
.
然后一切也会 "飞 "起来(虽然,低低的...)。
 
C-4:

目标: 通过唯一的ID(最好是长类型)来唯一地识别一个类的实例。唯一的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的位数OR y |= x。
位数排他性OR操作
的二进制表示y和x y ^= x。

也许y != x;也能发挥作用

SZY:关于名字的唯一性等。- 像往常一样,问题归结为一个老问题:如何在节省内存的同时不损失性能。

要么使用具有唯一名称的字符串数组,从而增加数据量,要么使用一个函数,该函数将使用基于输入数据的算法来形成唯一的名称,从而降低性能但节省内存

 
 
sergeev:

不在那里。

但在这里https://docs.mql4.com/ru/basis/operations/bit


不在那里!;)

SZY: 这个信息是一样的,只是赋值和位操作的例子是一样的,因为我的链接说 "位操作只对整数进行",如果你想的话,我可以告诉你确切的链接;),我想C-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代码库中。


奥基。