一学一做看视频网站有哪些,美食网站策划书范文,网站开发与运营,贵阳做网站方舟网络目录 同余定理哈希函数加密算法 余数有很多的应⽤场景#xff0c;⽐如散列函数、加密算法#xff0c;循环冗余校验等等。生活中也有很多与余数有关的例子。 比如#xff0c;你要将1147条数据分页写入#xff0c;每页10条#xff0c;计算总页数。就可以用1147除以10#x… 目录 同余定理哈希函数加密算法 余数有很多的应⽤场景⽐如散列函数、加密算法循环冗余校验等等。生活中也有很多与余数有关的例子。 比如你要将1147条数据分页写入每页10条计算总页数。就可以用1147除以10商114余7所以总页数就是1141115最后的余数7就是多出来不够⼀页的数据。 再比如今天是星期四你需要知道50天之后是星期几就可以用50除以7⼀个星期有7天余1 。然后在今天的基础上加⼀天也就是50天之后是星期五。
余数总是在⼀个固定的范围内。比如你拿任何⼀个整数除以7得到的余数肯定是在06之间的某⼀个数。所以当我们知道今天是星期⼀那便可以知道这⼀天之后的第1万天、10万天是星期几。
比如
a 123456
b 7
c a % b
print(c) #余4a 7125893
b 7
c a % b
print(c) #余5整数是没有边界的它可能是正无穷也可能是负无穷。但是余数却可以通过某⼀种关系让整数处于⼀个确定的边界内。假如今天是星期⼀求从今天开始的100天⾥有多少个星期 用100除以7商14余2也就是说这100天⾥有14周多2天。
换个⻆度可以说这100天⾥第1天、第8天、第15天等等在余数的世界⾥都被认为是同⼀天因为它们的余数都是1都是星期⼀。同理第2天、第9天、第16天余数都是2都是星期⼆。
同余定理
这些数的余数都是⼀样的所以被归类到了⼀起这⼀结论被称为同余定理。就是两个整数a和b如果它们除以正整数n得到的余数相等我们就可以说a和b对于模n同余。也就是说所有星期⼀都是同余的同理星期二、星期三、星期四等等这些天也都是同余的。还有我们经常提到的奇数和偶数其实也是同余定理的⼀个应用。
同余定理是一种在数学中广泛应用的方法用于判断两个整数之间是否具有某种关系。可以通过使用模运算符%来实现同余定理从而对数据进行分类。以下是一个简单的同余定理示例用于将整数分为三类
def classify(num):if num % 3 0:return Class Aelif num % 3 1:return Class Belse:return Class C不管你的模是几最终得到的余数肯定都在⼀个范围内。比如除以7可以得到了星期几除以2就得到了奇偶数。所以按照这种方式, 我们就可以把无穷多个整数分成有限的类。比如哈希函数。
生成随机数也是同余定理的常见应用。 a、c、m分别是同余定理中的参数x是初始值循环生成随机数时每次将当前的x带入同余公式中计算得到新的x值。在使用同余定理生成随机数时需要选择合适的参数和初始值否则可能会出现随机数分布不均匀或者重复的情况。
# 定义参数
a 1103515245
c 12345
m 2**32# 定义初始值
x 0# 循环生成随机数
for i in range(10):x (a * x c) % mprint(x)哈希函数
在每个编程语言中都会有对应的哈希函数。哈希有的时候也会被译为散列简单来说它就是将任意⻓度的输⼊通过哈希算法压缩为某⼀固定⻓度的输出。
假如你想要快速读写100万条数据记录要达到高速地存取最理想的情况是开辟⼀个连续的空间存放这些数据这样可以减少寻址的时间。当我们并没有能够容纳100万条记录的连续地址空间时可以看看系统是否可以提供若干个较小的连续空间并能存放⼀定数量的记录。比如我们找到了100个较⼩的连续空间这些空间彼此之间是被分隔开来的但是内部是连续的并足以容纳1万条记录连续存放那就可以使⽤同余定理来设计⼀个散列函数实现哈希表的结构。
def hash_function(key):# 假设key是字符串类型hash_value 0for i in range(len(key)):# 将每个字符的ASCII码相加hash_value ord(key[i])# 取余数得到哈希值return hash_value % 10上述代码实现了一个简单的哈希函数它将输入的字符串中每个字符的ASCII码相加并取余数得到哈希值。在实际应用中还需要考虑哈希冲突、哈希表大小等因素。
哈希函数是一种将输入映射到固定大小输出的函数常用于快速查找、数据加密等场景。假设有两条记录它们的记录标号分别是1和101。我们把这些模100之后余数都是1的存放到第1个可⽤空间⾥。以此类推将余数为2的2、102、202等存放到第2个可⽤空间将100、200、300等存放到第100个可⽤空间⾥。这样就可以根据求余的快速数字变化对数据进⾏分组并把它们存放到不同的地址空间⾥。⽽求余操作本身非常简单几乎不会增加寻址时间。
加密算法
还可以在公式中加⼊⼀个较⼤的随机数MAX引⼊MAX随机数可以增强加密算法的保密程度。⽐如说要加密⼀组三位数设定⼀个这样的加密规则
先对每个三位数的个、十和百位数都加上⼀个较⼤的随机数。然后将每位上的数都除以7⽤所得的余数代替原有的个、十、百位数。最后将第⼀位和第三位交换。
这就是⼀个基本的加密变换过程。
import randomdef encrypt(num):# 生成随机数rand_num random.randint(1000, 9999)# 分离百位、十位和个位a num // 100b (num % 100) // 10c num % 10# 加上随机数a rand_num // 100b (rand_num % 100) // 10c rand_num % 10# 对每位上的数进行除7取余操作a % 7b % 7c % 7# 交换第一位和第三位a, c c, a# 合并三位数字encrypted_num a * 100 b * 10 creturn encrypted_num# 测试样例
num 469
encrypted_num encrypt(num)
print(原始数字, num)
print(加密后数字, encrypted_num)