我需要一个哈希算法,输出一个长度最多为20个字符的字母数字字符串。对于"字母数字"我的意思是[a-zA-Z0-9]
。
输入是规范形式的UUID(例如550e8400-e29b-41d4-a716-446655440000
)
另一种方法是将SHA1或MD5哈希值转换为具有这些限制的字符串吗?
感谢。
修改
不需要加密安全。碰撞会使数据不准确,但如果它们偶尔发生,我就可以忍受它。
编辑2
我不知道截断MD5或SHA1会不会经常发生冲突。现在我想知道将MD5值或SHA1值截断为20个字符是否更好。
答案 0 :(得分:16)
只需从GUID的哈希中剪切您不需要的字符。使用良好的散列函数,散列的任何部分的不可预测性与部件的大小成比例。如果你愿意,你可以编码它基础32而不是标准的十六进制基数16.请记住,这不会显着改善每个字符的熵(仅25%)。
对于非加密用途,是否截断MD5,SHA1或SHA2并不重要。熵都没有任何明显的缺陷。