哈希算法

2018-11-28  本文已影响0人  pubalabala
哈希算法 - 哈希摘要 - 数字签名/数字指纹 - 防篡改/保护敏感信息
import hashlib


class StreamHasher(object):

    def __init__(self, algorithm='md5', size=4096):
        self.size = size
        alg = algorithm.lower()
        if alg == 'md5':
            self.hasher = hashlib.md5()
        elif alg == 'sha1':
            self.hasher = hashlib.sha1()
        elif alg == 'sha256':
            self.hasher = hashlib.sha256()
        elif alg == 'sha512':
            self.hasher = hashlib.sha512()
        else:
            raise  ValueError('不支持指定的哈希算法')

    def to_md5_digest(self, stream):
        '''生成MD5摘要'''
        for buf in iter(lambda: stream.read(self.size), b''):
            self.hasher.update(buf)
        return self.hasher.hexdigest()

    def __call__(self, stream):
        return self.to_md5_digest(stream)
加密解密
编码和解码 - 将内存中的二进制数据处理成其他的形式 - BASE64
  110000   111010    11100   110101
00110000 00111010 00011100 00110101
魔术方法
class Student(object):

    def __init__(self, stuid, name, gender):
        self.stuid = stuid
        self.name = name
        self.gender = gender

    def __hash__(self):
        return self.stuid

    def __eq__(self, other):
        # return self.stuid == other.stuid
        return self.stuid == other.stuid and self.name == other.name

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        # 当类中的方法要需要使用上下文语法时, 如 with create_studetn() as stu, 必须先定义__enter__和__exit__两个方法来对方法的开始和结束进行处理, 如数据库的开启和关闭.
        pass

    def create_student(self):
        pass
整体代码
import hashlib


class StreamHasher(object):

    def __init__(self, algorithm='md5', size=4096):
        self.size = size
        alg = algorithm.lower()
        if alg == 'md5':
            self.hasher = hashlib.md5()
        elif alg == 'sha1':
            self.hasher = hashlib.sha1()
        elif alg == 'sha256':
            self.hasher = hashlib.sha256()
        elif alg == 'sha512':
            self.hasher = hashlib.sha512()
        else:
            raise  ValueError('不支持指定的哈希算法')

    def to_md5_digest(self, stream):
        '''生成MD5摘要'''
        for buf in iter(lambda: stream.read(self.size), b''):
            self.hasher.update(buf)
        return self.hasher.hexdigest()

    def __call__(self, stream):
        return self.to_md5_digest(stream)


class Student(object):

    def __init__(self, stuid, name, gender):
        self.stuid = stuid
        self.name = name
        self.gender = gender

    def __hash__(self):
        return self.stuid

    def __eq__(self, other):
        # return self.stuid == other.stuid
        return self.stuid == other.stuid and self.name == other.name

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        # 当类中的方法要需要使用上下文语法时, 如 with create_studetn() as stu, 必须先定义__enter__和__exit__两个方法来对方法的开始和结束进行处理, 如数据库的开启和关闭.
        pass

    def create_student(self):
        pass



def main():
    # with open('C:\\Users\\ap-le\Desktop\\PokerGame.py', 'rb') as stream:
    #     # 分流读入文件, 节省内存
    #     buf = stream.read(4096)
    #     while buf:
    #         hasher.update(stream.read())
    #         buf = stream.read(4096)
    # print(hasher.hexdigest())
    #
    # # 使用迭代对象读入文件
    # with open('C:\\Users\\ap-le\Desktop\\PokerGame.py', 'rb') as stream:
    #     for buf in iter(lambda: stream.read(4096), b''):
    #         hasher.update(buf)
    # print(hasher.hexdigest())
    # sh = StreamHasher()
    # sh = StreamHasher('sha1')
    # sh = StreamHasher('sha256')
    sh = StreamHasher('sha512')
    with open('C:\\Users\\ap-le\Desktop\\PokerGame.py', 'rb') as stream:
        print(sh.to_md5_digest(stream))
        print(sh(stream))

    print('-'*50)
    set1 = {
        Student(1001, 'Jefferson', True),
        Student(1001, 'Jefferson', True),
        Student(1001, '王大锤', True)
    }
    print(len(set1))
    print(set1)


if __name__ == '__main__':
    main()
上一篇下一篇

猜你喜欢

热点阅读