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

 
C-4:

下面是一个Adler32哈希函数的工作 实例。

该函数的基本代码取自维基百科,并为MQL5稍作修改。下面是脚本的结果。

正如你所看到的,这个函数返回的所有值都是绝对不同的,尽管字符串本身并没有什么不同。

为什么是ulong而不是uint?

而这个函数中对数组的操作是非常低效的。修改代码并将unicode分成两个独立的符号会更容易--它将会快50倍。

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毫秒对13822毫秒,300万运行....。只有4次不同的......,但没有转换损失
 

是的,这是正确的,因为32位是一个整数,而不是一个长。虽然,坦率地说,我会修改64位版本的哈希函数。毕竟,碰撞的概率比较小,而且很容易调整为魔术专家。尽管在另一方面,目前的实现与MQL4完全兼容(因为它没有长类型)。

P.S. 如果我在循环之前将字符串转换为Uchar数组,并在循环中一个接一个地查看数组的值,不是会更快吗?但我认为在循环中每次都调用StringGetCharacter(buf, n)太昂贵了。

 
C-4:

是的,这是正确的,因为32位是一个整数,而不是一个长。 虽然,坦率地说,我会修改64位版本的哈希函数。毕竟,碰撞的概率比较小,而且很容易调整为魔术专家。然而,另一方面,目前的实现与MQL4完全兼容(因为它没有长类型)。

P.S. 如果我在循环之前将字符串转换为Uchar数组,然后在循环中逐一检查数组的值,是不是会更快?不过,我认为在循环中每次调用StringGetCharacter(buf, n)是相当昂贵的。

我理解这种 算法只能 是32位的。

那么在循环之前的转换呢--如何转换?然后你将需要一个数组...动态分配...是的,而且转换时有信息损失。

 
AlexSTAL:

我理解这种 算法只能 是32位的。

更确切地说,对于每个区块的长度,我们必须专门 选择一个特征多项式,它将具有 "良好的 "散列属性,即或多或少地将输入集均匀地 映射到散列集。
 
AlexSTAL:
3681毫秒对13822毫秒,300万运行....。只有4次不同的......,但没有转换损失

如果用dat & 0xFF 代替dat % 256 的操作会更快,s = (...)%65521; 分解为s = (...); if(s>=65521) s-=65521。


 

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

所以这是周期前的常规转换。

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

但同样,这个功能只在MQL5中可用。根据我的理解,信息的损失发生在Unicode->ASCII中,这是很容易接受的。

 
C-4:

所以这是周期前的常规转换。

但同样,这个功能只在MQL5中可用。根据我的理解, 信息的损失发生在Unicode->ASCII中,这是很容易接受的

嗯,是的...这只在你的特定任务中可以接受,而对算法来说则不能接受。

仔细看看64位的MaHash8v64(ulong)算法,或者也许这两种算法一起看(至少,对我来说会这样做)。

MQL4中没有Unicode,所以也没有问题。

P.S. StringGetCharacter是一个相当快的函数,它只从所需的位置返回WORD(MQL5的ushort),也就是说,它对字符串根本不起作用。

 

如果谁有一个 C++的windows VS应用项目,最好是10版的。该项目需要在其工作中使用一个dll。我将把它作为一个模板。

最好是将该dll称为MLP2HL.dll。

提前感谢。

 
joo:

如果谁有一个C++的windows VS应用项目,最好是10版的。该项目需要在其工作中使用一个dll。我将把它作为一个模板。

最好是将该dll称为MLP2HL.dll。

预先感谢你。

模板在这里:...MetaTrader 4/experts/samples/DLLSample

VS 2010会自动转换。名称可以改变。
 
Zhunko:

该模板在这里:...MetaTrader 4/experts/samples/DLLSample

VS 2010会自动转换。名称可以改变。

不,我知道dll模板的事。:)

我需要一个exe项目 模板,其中包含dll的来源,这样我就可以调试它。dll是不可执行的,必须由人调用。我决定研究Intel Parallel Studio 2011 for VS.