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 として出力するので、代わりに 16 進数値を使用しないでください。これにより、まったく同じ数値が得られます。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 に答える