3

我对 Matlab 相当陌生,虽然不是编程。我正在尝试散列一个字符串,并取回一个作为该字符串唯一 ID 的值。我正在使用 FileExchange 中的这个DataHash函数,它将哈希作为整数向量返回。到目前为止,我发现将其转换为单个数值的最佳解决方案是:

hash_opts.Format = 'uint8';
hash_vector = DataHash(string, hash_opts);
hash_string = num2str(hash_vector);
% Use a simple regex to remove all whitespace from the string,
% takes it from '1 2 3 4' to '1234'
hash_string = regexprep(hash_string, '[\s]', '');
hashcode = str2double(hash_string);

一个不依赖于 DataHash 的可重现示例:

hash_vector = [1, 23, 4, 567];
hash_string = num2str(hash_vector);
% Use a simple regex to remove all whitespace from the string,
% takes it from '1 2 3 4' to '1234'
hash_string = regexprep(hash_string, '[\s]', '');
hashcode = str2double(hash_string); % Output: 1234567

有没有更有效的方法来实现这一点,而不诉诸正则表达式?

4

2 回答 2

7

是的,Matlab 的正则表达式实现并不是特别快。我建议你使用strrep

hashcode = str2double(strrep(hash_string,' ',''));

或者,您可以使用首先不插入空格的字符串创建方法:

hash_vector = [1, 23, 4, 567];
hash_string = str2double(sprintf('%d',hash_vector))

只需确保您的哈希数小于 2^53 或转换为 double 可能不准确

于 2013-05-27T01:30:08.700 回答
3

我已经看到已经有一个答案 - 虽然它会因为省略前导 0 而失去精确度 - 我不确定它是否会给你带来麻烦,但我不想依赖它。

当您输出为 uint8 时,为什么不使用十六进制值 - 这将为您提供完全相同的数字。使用 dec2hex 转换回来也很容易。

hash_vector = [1, 23, 4, 253]
hash_str=sprintf('%02x',hash_vector); % to assure every 8 bit use 2 hex digits!
hash_dig=hex2dec(hash_str)

顺便提一句。- 您的样本哈希包含 567 - uint8 中的一个不可能的数字。


看过 DataHash 之后,问题也是为什么不首先使用 base64 或 hex。

于 2013-05-27T08:10:08.507 回答