用于比较matlab中哈希值的最快类型

时间:2017-08-15 15:07:13

标签: matlab performance hash

我在Matlab中有一个表,其中一些列代表128位哈希值。

我想根据这些哈希值将行匹配到一行或多行。

目前,哈希值表示为十六进制字符串,并与strcmp()进行比较。但是,处理表格还需要几秒钟。

在matlab中比较两个哈希值的最快方法是什么?

我尝试将它们转换为分类变量,但速度要慢得多。据我所知,Matlab没有128位数字类型。 名义序数类型已弃用。

还有其他可行的吗?

下面的代码类似于我正在做的事情:

nodetype = { 'type1'; 'type2'; 'type1'; 'type2' };
hash = {'d285e87940fb9383ec5e983041f8d7a6'; 'd285e87940fb9383ec5e983041f8d7a6'; 'ec9add3cf0f67f443d5820708adc0485'; '5dbdfa232b5b61c8b1e8c698a64e1cc9' };

entries = table(categorical(nodetype),hash,'VariableNames',{'type','hash'});

%nodes to match. filter by type or some other way so rows don't match to
%themselves.
A = entries(entries.type=='type1',:);
B = entries(entries.type=='type2',:);

%pick a node/row with a hash to find all counterparts of
row_to_match_in_A = A(1,:);
matching_rows_in_B = B(strcmp(B.hash,row_to_match_in_A.hash),:);

% do stuff with matching rows...
disp(matching_rows_in_B);

哈希字符串是我正在使用的忠实表示,但它们不一定在原始源中作为字符串读取或存储。它们只是为此目的而转换,因为它是进行比较的最快方法。

1 个答案:

答案 0 :(得分:1)

优化很好,如果你需要它。自己尝试一下,measure the performance获得相关测试用例。

一些建议:

  • 排序数组更容易/更快搜索
  • Matlab的默认数字为doublebut you can also construct integers。为什么不使用2 uint64而不是128位列?首先搜索上部64位,然后搜索下部;甚至更好:将ismemberrow选项一起使用,并将哈希值放入行中:

    A = uint64([0 0;
                0 1;
                1 0;
                1 1;
                2 0;
                2 1]);
    srch = uint64([1 1;
                   0 1]);
    [ismatch, loc] = ismember(srch, A, 'rows')       
    
    > loc =
         4
         2
    
  • 查看您使用的比较函数(例如edit ismember)并删除不必要的操作(例如sort),并且事先知道的安全检查不会造成问题。 Like this solution does。或者,如果您打算多次调用搜索功能,请提前排序并稍后跳过搜索功能中的检查/排序。