具有定义其输出生成长度的能力的散列函数

时间:2015-01-31 12:12:52

标签: matlab hash md5 hashcode sha

我需要在matlab中有一个哈希函数,它能够定义生成的哈希长度。例如,MD5可以生成长度为128位的散列。但是,我需要定义各种具有设计长度的散列函数,例如10,16,20,...

1 个答案:

答案 0 :(得分:0)

如果您使用CalcMD5中的FEX (Matlab File Exchange)软件包,可以使用以下解决方案:

function hash = myhash(len, value)
% len: The desired hash length. Integer
% value: The value to hash. String.

% Set this to whatever hash length your native hash algorithm employs.
nativehashlength = 32;
if len <= nativehashlength
    % Using the CalcMD5 package to obtain MD5 hash
    hash = CalcMD5(value);
    hash = hash(1:len);
else
    % Could to a lot of stuff, but i choose to hash the repeated value
    runs = ceil(len/nativehashlength);
    hash = [];
    aggregated = value;
    for r = 1:runs
        % Compute hash and add to hash string
        hash = [hash CalcMD5(aggregated)]; %#ok
        % Update the aggregate
        aggregated = [aggregated value]; %#ok
    end
    hash = hash(1:len);
end
end

这也适用于短长度的字符串/字符数组,例如

>> myhash(100,'hello')
ans = 5d41402abc4b2a76b9719d911017c59223b431acfeb41e15d466d75de822307c99fb31087791f6317ad7c6da1433f1729436
>> myhash(2,'world') 
ans =
7d

当然,'hello'的大小为10的散列将等于'hello'的大小为20的散列的前十个散列字符,但是根据所需的散列大小,它不会被要求生成非常不同的散列函数。但是,这可以通过使用所请求的散列大小对值进行盐析来轻松实现,例如。

关于Matlab中散列内容的FEX还有更多内容,例如: here