哈希算法简介

大家都知道,设计器里有有个密码变量,这会让我们在输入密码时为不可见。
但是最近在项目上遇到一个新的需求,就是需要对密码进行定期的更改,对他人都不可见。
这里我用 random 函数,对 6 位数密码进行随机挑选,在客户系统进行密码操作后,生成新的密码。将新密码重新写入到 excel 中。但是这里 excel 对他人是可见的。在这里我就想到了哈希算法。这里做一下简单的介绍:

哈希(hash)也翻译作散列。Hash 算法,是将一个不定长的输入,通过散列函数变换成一个定长的输出,即散列值。
这种散列变换是一种单向运算,具有不可逆性即不能根据散列值还原出输入信息,因此严格意义上讲 Hash 算法是一种消息摘要算法,不是一种加密算法。常见的 hash 算法有:SM3、MD5、SHA-1 等 。

1 自定义哈希函数
自定义哈希函数通常可利用除留余数、移位、循环哈希、平方取中等方法。下面这个例子就是我自己定义的一个哈希函数,运用了取模运算和异或运算。

# coding:utf-8
# 自定义哈希函数

def my_hash(x):
    return (x % 7) ^ 2
 
print(my_hash(1)) # 输出结果:3
print(my_hash(2)) # 输出结果:0
print(my_hash(3)) # 输出结果:1
print(my_hash(4)) # 输出结果:6

2 hash() 函数

在 python 中有内置的哈希函数 hash(),返回一个对象(数字、字符串,不能直接用于 list、set、dictionary)的哈希值。示例代码如下:

# coding:utf-8
# hash()
 
print(hash(1))
print(hash(1.0))    # 相同的数值,不同类型,哈希值是一样的
print(hash("abc"))
print(hash("hello world"))

在运行时发现了一个现象:相同字符串在同一次运行时的哈希值是相同的,但是不同次运行的哈希值不同。这是由于 Python 的字符串 hash 算法有一个启动时随机生成 secret prefix/suffix 的机制,存在随机化现象:对同一个字符串输入,不同解释器进程得到的 hash 结果可能不同。因此当需要做可重现可跨进程保持一致性的 hash,需要用到 hashlib 模块。

3.3 hashlib 模块

hashlib 提供了常见的摘要算法,如 MD5,SHA1 等等。示例代码如下:

# coding:utf-8
# 使用hashlib模块
import hashlib
 
md5 = hashlib.md5()     # 应用MD5算法
data = "hello world"
md5.update(data.encode('utf-8'))
print(md5.hexdigest())