哈希游戏- 哈希游戏平台- 哈希游戏官方网站举一个简单的例子,我们常见的短网址应用,我们需要把一个不定长的网址URI转换成为一个比较短的,固定长度的值,对于这个需求,哈希函数的定义太贴合了,那么我们是不是可以使用md5 sha1 sm3之类的来实现呢,这实际上是可以的,但是呢,对于短网址来说,我们需要的是更快的计算,较少的冲突,我们不需要他符合密码学哈希函数的所有特性(有关密码学哈希函数的特性,接下来的章节在讲)对于密码学安全的哈希函数来说,他的计算相对来说是比较慢的,可能大家没有体会,大家思考一下是不是就突然火一把的btc,他的pow就是基于密码学安全的哈希函数,如果这种哈希函数可以被非常快速计算,那么就没有矿工什么事儿了。
对于短网址来说,我们希望它计算的越快越好,可以满足这个需求的算法也比较多,比如说MurmurHash算法,这个算法在2008年被发明出来,在很多软件比如Redis,openresty,LevelDB,MemCache等等都有应用,这个算法有两种长度的哈希值(这里指的v2/v3,这里给自己挖个坑,请叫我挖坑小能手,后面具体聊一聊这个算法的具体结构,这里就不展开讲了)分别是32bits和128bits对于短网址而言,我们采用32bits的结果就可以了。当然对于短网址生成来说,也有不基于哈希函数来实现的,可以采用分布式发号器(Distributed ID Generator)来实现,这里也不过多去描述了。对于MurmurHash和md5计算速度的比较,可以参考文末的参考资料,这里对于Lua的实现来说前者的速度是后者的将近10倍。
本文主要介绍了一下什么是哈希函数,以及密码学哈希函数需要满足那些特性,对于一般的哈希函数来说,我们不一定要去追求他的安全特性,比如说字典的实现,短网址,或者说是图片名称保存这些,我们只是要他冲突小,速度快就够了,而对于密码学来说,我们是需要保证他的安全特性的,比如数字签名,密码的存储,我们可能要牺牲一部分的性能来换回更加的安全。举个简单的例子,比如说我们拿到一个密码的哈希值,那么我们希望去找到这个原来密码的明文,这里我们只能去通过不断的穷举实现,假设两个哈希算法的抗碰撞性程度相似,那么如果一个哈希算法的计算时间要更长,那么对应的穷举时间也会相应的增加,因此这就更加能保护我们密码的安全,还是那句话,安全和效率其实不太好做到双赢,我们只能在安全和效率中间取得一个trade off。