📜  需要数据和哈希 (1)

📅  最后修改于: 2023-12-03 14:58:43.334000             🧑  作者: Mango

需要数据和哈希

在计算机科学中,数据(Data)是指计算机中存储的各种信息,例如数字、文本、图像等。而哈希(Hash)则是一种将任意大小的数据映射成固定大小值的算法。

数据

在编程中,我们经常需要处理各种数据。数据可以分为两大类:

  1. 原始数据类型(Primitive Data Types):包括整数、浮点数、布尔值等。
  2. 复合数据类型(Composite Data Types):包括数组、结构体、类等。
原始数据类型

原始数据类型是计算机硬件能够直接支持的数据类型,常见的包括:

  • 整数(Integer):表示整数值,例如 1-542 等。
  • 浮点数(Floating Point):表示小数值,例如 3.14-1.23e-4 等。
  • 布尔值(Boolean):表示真或假,只有两个取值 truefalse
  • 字符(Character):表示单个字符,例如 a~\n 等。

在程序中,我们可以用变量来存储和使用数据:

# 声明一个整数变量
x = 42

# 声明一个布尔值变量
is_valid = True

# 声明一个浮点数变量
pi = 3.141592653589793

# 声明一个字符变量
ch = 'a'
复合数据类型

复合数据类型是由多个原始数据类型组合而成的数据类型,常见的包括:

  • 数组(Array):存储一组相同类型的数据。
  • 结构体(Struct):表示多个字段组成的复杂数据类型。
  • 类(Class):用于面向对象编程,包括属性和方法。

在程序中,我们可以用复合数据类型来组织和操作数据:

# 声明一个整数数组
numbers = [1, 2, 3, 4, 5]

# 声明一个结构体类型
class Person:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

# 声明一个类对象
person = Person('Alice', 20, 'Female')
哈希

哈希是一种将任意大小的数据映射成固定大小值的算法,常用于数据的加密、验证、索引等场合。哈希算法需要满足以下特点:

  1. 相同的输入必须得到相同的输出。
  2. 不同的输入应该尽可能地映射到不同的输出。
  3. 哈希函数应该具有高效性,尽可能快地计算出哈希值。

常见的哈希函数包括:

  • MD5:输出 128 位哈希值。
  • SHA-1:输出 160 位哈希值。
  • SHA-256:输出 256 位哈希值。

在程序中,我们可以用哈希函数来加密数据、验证数据的完整性、快速查找数据等:

import hashlib

# 计算一个字符串的 MD5 哈希值
def md5(s):
    return hashlib.md5(s.encode()).hexdigest()

# 计算一个字符串的 SHA-256 哈希值
def sha256(s):
    return hashlib.sha256(s.encode()).hexdigest()

# 加密一个密码明文,并存储其哈希值
password = '123456'
password_hash = md5(password)
store_password_hash_in_database(password_hash)

# 验证用户输入的密码是否正确
input_password = get_password_from_user()
if md5(input_password) == password_hash:
    login()
else:
    show_error_message('Wrong password!')

# 在数组中查找一个元素的位置
def find_element(array, element):
    for i, v in enumerate(array):
        if sha256(v) == sha256(element):
            return i
    return -1

# 计算一个文件的 MD5 哈希值
def md5_file(filename):
    with open(filename, 'rb') as f:
        return hashlib.md5(f.read()).hexdigest()