diff m-toolbox/classes/+utils/@prog/hash.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/classes/+utils/@prog/hash.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,94 @@
+function h = hash(inp,meth)
+% HASH - Convert an input variable into a message digest.
+% 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% 
+% HASH - Convert an input variable into a message digest using any of
+%        several common hash algorithms
+%
+% USAGE: h = hash(inp,'meth')
+%
+% inp  = input variable, of any of the following classes:
+%        char, uint8, logical, double, single, int8, uint8,
+%        int16, uint16, int32, uint32, int64, uint64
+% h    = hash digest output, in hexadecimal notation
+% meth = hash algorithm, which is one of the following:
+%        MD2, MD5, SHA-1, SHA-256, SHA-384, or SHA-512 
+%
+% NOTES: (1) If the input is a string or uint8 variable, it is hashed
+%            as usual for a byte stream. Other classes are converted into
+%            their byte-stream values. In other words, the hash of the
+%            following will be identical:
+%                     'abc'
+%                     uint8('abc')
+%                     char([97 98 99])
+%            The hash of the follwing will be different from the above,
+%            because class "double" uses eight byte elements:
+%                     double('abc')
+%                     [97 98 99]
+%            You can avoid this issue by making sure that your inputs
+%            are strings or uint8 arrays.
+%        (2) The name of the hash algorithm may be specified in lowercase
+%            and/or without the hyphen, if desired. For example,
+%            h=hash('my text to hash','sha256');
+%        (3) Carefully tested, but no warranty. Use at your own risk.
+%        (4) Michael Kleder, Nov 2005
+%        (5) This is a direct copy of the code from Michael Kleder. Only
+%            the function name was changed to bring it in line with the 
+%            LTPDA naming convention. (M Hewitson 15-09-07)
+% 
+% EXAMPLE:
+%
+% algs={'MD2','MD5','SHA-1','SHA-256','SHA-384','SHA-512'};
+% for n=1:6
+%     h=hash('my sample text',algs{n});
+%     disp([algs{n} ' (' num2str(length(h)*4) ' bits):'])
+%     disp(h)
+% end
+% 
+% NOTE:   Original taken from MATHWORKS file exchange.
+% Author: Michael Kleder, Nov 2005 
+% http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=8944&objectType=file
+% 
+% $Id: hash.m,v 1.1 2008/06/18 13:35:11 hewitson Exp $
+% 
+% 
+
+inp=inp(:);
+% convert strings and logicals into uint8 format
+if ischar(inp) || islogical(inp)
+    inp=uint8(inp);
+else % convert everything else into uint8 format without loss of data
+    inp=typecast(inp,'uint8');
+end
+
+% verify hash method, with some syntactical forgiveness:
+meth=upper(meth);
+switch meth
+    case 'SHA1'
+        meth='SHA-1';
+    case 'SHA256'
+        meth='SHA-256';
+    case 'SHA384'
+        meth='SHA-384';
+    case 'SHA512'
+        meth='SHA-512';
+    otherwise
+end
+algs={'MD2','MD5','SHA-1','SHA-256','SHA-384','SHA-512'};
+if isempty(strmatch(meth,algs,'exact'))
+    error(['Hash algorithm must be ' ...
+        'MD2, MD5, SHA-1, SHA-256, SHA-384, or SHA-512']);
+end
+
+% create hash
+x=java.security.MessageDigest.getInstance(meth);
+x.update(inp);
+h=typecast(x.digest,'uint8');
+h=dec2hex(h)';
+if(size(h,1))==1 % remote possibility: all hash bytes < 128, so pad:
+    h=[repmat('0',[1 size(h,2)]);h];
+end
+h=lower(h(:)');
+clear x
+return
\ No newline at end of file