我对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
有没有更有效的方法来实现这一目标,而无需使用正则表达式?
答案 0 :(得分:7)
是的,Matlab的正则表达式实现并不是特别快。我建议您使用strrep
:
hashcode = str2double(strrep(hash_string,' ',''));
或者,您可以使用不首先插入空格的字符串创建方法:
hash_vector = [1, 23, 4, 567];
hash_string = str2double(sprintf('%d',hash_vector))
确保您的哈希值小于2 ^ 53或conversion to double might not be exact。
答案 1 :(得分: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。