2013-05-27 45 views
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 

是否有更有效的方法實現這一點,而不訴諸正則表達式?

回答

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

+0

@OlegKomarov:我們真的在想同樣的事情。甚至下降到雙精度細節。抱歉。 – horchler

+0

謝謝。我認爲MD5和SHA-1的哈希值可能大於2^53,所以我很欣賞這個警告。 – Marius

+0

@horchler哈哈,我很驚訝自己! – Oleg

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) 

btw。 - 你的sampe散列包含567 - uint8中不可能的數字。


看了DataHash之後,問題也將是爲什麼不使用base64或十六進制首先。

+0

謝謝,我試圖包含一些上下文,因爲我知道有多個點可能出錯了,從一開始就使用十六進制值寫入可能更明智。 – Marius