提问人:Marius 提问时间:5/27/2013 更新时间:5/27/2013 访问量:127
连接数值向量的数字
Joining the digits of a numeric vector
问:
我对 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
有没有更有效的方法可以在不诉诸正则表达式的情况下实现这一点?
答:
7赞
horchler
5/27/2013
#1
是的,Matlab 的正则表达式实现并不是特别快。我建议你使用 strrep
:
hashcode = str2double(strrep(hash_string,' ',''));
或者,您可以使用不首先插入空格的字符串创建方法:
hash_vector = [1, 23, 4, 567];
hash_string = str2double(sprintf('%d',hash_vector))
只要确保您的哈希数小于 2^53,否则转换为 double 可能不准确。
评论
0赞
horchler
5/27/2013
@OlegKomarov:我们真的是这么想的。甚至低至双精度的细节。不好意思。
0赞
Marius
5/27/2013
谢谢。我认为 MD5 和 SHA-1 的哈希值都可以大于 2^53,所以我很感激这个警告。
0赞
Oleg
5/27/2013
@horchler哈哈,我自己都很惊讶!
3赞
bdecaf
5/27/2013
#2
我已经看到已经有答案了——尽管它失去了精确度,因为它省略了前导 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)
顺便说一句。- 您的 sampe 哈希值包含 567 - uint8 中不可能的数字。
看过 DataHash 之后,问题也是为什么不首先使用 base64 或十六进制。
评论
0赞
Marius
5/27/2013
谢谢,我试图包含一些上下文,因为我知道我可能出错了多个点,从一开始就使用十六进制值编写可能更明智。
评论