PHP密码散列算法的学习 不知道大家有没有看过 Laravel 的源码。在 Laravel 源码中,对于用户密码的加密,使用的是 password_hash() 这个函数。...crypt() 函数也是一种单向散列函数,默认情况下是基于 UNIX DES 算法,这个函数的盐值是可选参数,如果没有盐值的话,它会生成的是一种简单的弱密码,所以在 PHP5.6 之后如果 crypt(...查看密码散列函数的加密算法 首先,我们还是看看当前环境中所支持的 password_hash() 算法。...我们简单的了解一下即可。 使用密码散列函数加密数据 重点还是在这个加密函数的应用上,我们就来看看 password_hash() 这个函数的使用。...algo 就是使用的加密算法,前面我们已经看过当前系统中只有 2y 这一种算法,所以我们使用的 PASSWORD_DEFAULT 这个默认算法也就只能是它了。
Django 自身也有一套相对完善的缓存系统,这篇文章来介绍一下使用 redis 作为 Django 缓存的使用方法,并且说一下我在使用缓存的过程中遇到的问题。...$ redis-server 查看 redis $ redis-cli 使用 django-redis django-redis 是一个可以让 django 使用 redis 作为缓存存储的第三方库,...", } } } django 缓存的使用 视图函数中使用缓存 下面的代码表示将 my_view 这个视图函数缓存60*15秒,也就是15分钟,这个视图所能指向的每个 url 都会单独创建一个缓存...函数中使用缓存 函数中使用缓存是最基本的使用方法,跟在其他非 django 中使用的方式一致,无非就是使用 set() 和 get() 方法。...模板中使用缓存 模板中使用缓存是我比较推荐的一种缓存方式,因为使用这种方式可以充分的考虑缓存的颗粒度,细分颗粒度,可以保证只缓存那些适合使用缓存的 HTML 片段。
为什么要使用缓存? 一个动态网站的基本权衡点就是,它是动态的。 每次用户请求页面,服务器会重新计算。...从开销处理的角度来看,这比你读取一个现成的标准文件的代价要昂贵的多 使用缓存,将多用户访问时基本相同的数据先缓存起来;这样当用户访问页面的时候,不需要重新计算数据,而是直接从缓存里读取,避免性能上的开销...配置django的缓存设置 settings.py中添加: CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache...": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } } } 使用Django内置的缓存...如在django自带的管理页面中,当模型发生修改时,会默认调用admin.ModelAdmin的save_model 或 delete_model 方法。
2.散列冲突 首先散列表是作用于数组上的,因为数组支持随机访问,所以能够达到O(1)的时间复杂度,而散列表本身就是要达到O(1)的时间复杂度,可是如果散列冲突了怎么办呢?...当我们往散列表中插入数据时,如果某个数据经过散列函数散列之后,存储位置已经被占用了,我们就从当前位置开始,依次往后查找,看是否有空闲位置,直到找到为止。...而如果取太低的话又会出现空间的浪费,比如取0.5,实际上才一半就扩容了。 3.LRU缓存淘汰算法 什么是LRU缓存淘汰算法呢?...实际上我们可以有很多种解法来实现LRU缓存,但是题目中要达到时间复杂度为O(1),如果使用链表或者数组都是不能实现的,这个时候就可以使用散列表了,每次get的时候如果存在此数据,那么我们就将它移动到链表的尾部...使用自定义散列表和自定义链表的方案比较复杂实现图如下。 ?
add column会修改旧的默认值 add column和modify column在default的语义上处理不一样。...如果仅仅是修改某一个字段的默认值,可以使用 alter table A alter column c set default 'c'; 用这种方式来替换modify,会省去重建表的操作,只修改frm文件...下面插入数据 insert into test values(null,"张三",18,null); 此时我们发现num字段为插入的null,而并不是我们设置的默认值0 3....此时只插入name insert into test (name) values("李四"); 此时我们可以看到“李四”的默认值变成了0。...结论:mysql 的默认值只有在insert语句中没有这个字段时才会生效,如果insert中有插入该字段而该字段取值又为null,null值将被插入到表中,默认值此时失效。
散列表的创建就是将Value通过散列函数和处理散列key值冲突的函数来生成一个key, 这个key就是Value的查找映射,我们就可以通过key来访问Value的值。...本篇博客我们就来好好的聊一下散列表的实现,当然主要还是构建散列函数还有解决冲突的函数,下方我们先给出散列函数为“除留取余法”和处理冲突的线性探测发的原理图,然后再给出面向对象的实现,最后在给出相应的代码实现...因为散列表由于散列函数与处理冲突函数的不同可以分为多种类型,但是每种类型之前的区别除了散列函数和冲突函数不同之外,其他的还是完全一致的,因为我们使用的是面向对象语言,所以我们可以将相同的放在父类中实现,...因为散列函数有许多种,而处理冲突的方法也有许多种,所以我们可以将其放到具体的子类中去实现。不同类型的散列表中这两个方法给出具体的散列函数和处理冲突的方法。 ?...2.除留取余法与线性探测 接下来我们要给出散列函数为“除留取余法”以及使用线性探测的方式来处理冲突的散列表。
今天介绍个小工具,Django的插件—— https://github.com/BertrandBordage/django-cachalot (Django和抹香鲸?)。...一个遗留的问题场景 话说很久很久之前,遇到过这样的一个问题,当时还是在用django自带得admin做项目,新闻的数据量很大,导致每次打开新闻的列表页都非常慢,把Django上能用的优化都用上之后好了些...怎么使用cachelot 上面说了些毫无营养的联想,再来说说怎么使用,github上说的很清楚了,使用相当简单: pip install django-cachalot #然后Django的installs_app...这个是正常得缓存逻辑,那么如果数据进行了更改怎么处理呢,cachalot也对执行写数据库的方法打了patch,在写的时候根据语句对缓存进行删除。...对于小站点或许有用,比如我的博客。但博客已经添加了view层的缓存。或许可以参考cachalot来做些缓存策略上的优化。
Django 缓存模式的使用(主要针对RestFul设计模式的项目) 有三种模式: 全站使用缓存模式(整个项目每个接口都会使用缓存,缺点:所以接口都无法实时性获取数据) 单独视图缓存模式(单个接口使用缓存...'django.middleware.cache.FetchFromCacheMiddleware', ] 但是伴随的缺点就是 没有设置 缓存的接口默认都会有600秒的缓存,如下 ?...无论清缓存还是换浏览器,因为缓存都是放在服务端的。 这就导致 那些不需要设置缓存,要求数据实时性较高的接口无法及时返回最新数据。 ...所以: 如果需要使用 from django.views.decorators.cache import cache_page, cache_control from django.views.decorators.vary...这种方式只针对一个接口使用缓存(个人倾向于使用此方式) 第三种: 涉及到模板的使用(具体没有研究过): ?
大家好,我是前端西瓜哥,今天我们来聊聊 OT 算法是什么。 OT 的英文全称是 Operational transformation,是一种处理协同编辑的算法。...谁最后修改,就全量使用他的修改,更早一些的其他人的修改会被丢弃。 用户自行处理冲突。...就像 git merge 导致的冲突一样,会提示哪个地方被同时修改了,让合并者手动选择使用哪一个修改; 使用一致性算法。...一致性算法是最好的选择,对用户最友好,不过带来了实现的复杂。 一致性问题 我们先来看看不使用 OT 导致的冲突问题。 假设用户 A 和用户 B 同时在编辑同一个文档,文档内容为 “12”。...使用 OT OT 算法可以解决一致性问题,我们来看看 OT 到底做了什么。 同样,原始内容是 “12”。
53.简述read、readline、readlines的区别? 54.什么是Hash(散列函数)? 55.python函数重载机制?...read 读取整个文件 readline 读取下一行 readlines 读取整个文件到一个迭代器以供我们遍历 54.什么是Hash(散列函数)?...散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。...该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums,或hashes)的指纹。...散列值通常用一个短的随机字母和数字组成的字符串来代表 55.python函数重载机制? 函数重载主要是为了解决两个问题。 1。可变参数类型。 2。可变参数个数。
HashMap的内部实现原理是什么? HashMap内部实现原理是数组+链表,通过散列算法将key值散列到数组中,如果到相同的位置,则通过拉链法解决散列冲突。...在JDK8中新增了红黑树结构,当HashMap中的散列冲突链表结构超过8个数据时,会从链表结构转换为红黑树结构。 2....HashMap的使用场景很多,这个使用场景就太多了,比如用作本地缓存。...LinkedHashMap因为它的链表结构可以实现LRU(最近最少使用),即缓存空间有限,当元素多余缓存空间,可淘汰掉最近最少使用的元素。...所以当要实现LRU缓存时,就可以将accessOrder设置为true实现。 TreeMap没有实际应用过,如果有需要排序的场景则使用TreeMap Set 10.
应该将不同的输入映射到不同的数字。例如, 如果一个散列函数不管输入是什么都返回 1,它就不是好的散列函数。最理想的情况是,将不同的输入映射到不同的数字。...『缓存是一种常用的加速方式,所有大型网站都使用缓存,而缓存的数据则存储在散列表中!』 ? # 创建一个手机薄 # 添加联系人及其电话号码。通过输入联系人来获悉其电话号码。...因此在使用散列表时,避开最糟情况至关重要。为此,需要避免冲突。避免冲突的几个指标是: 较低的填装因子:填装因子 = 散列表包含的元素数/位置总数 ? 良好的散列函数:让数组中的值呈均匀分布。 ?...冲突很糟糕,应使用可以最大限度减少冲突的散列函数。 散列表的查找、插入和删除速度都非常快。 散列表适合用于模拟映射关系。 一旦填装因子超过 0.7,就该调整散列表的长度。...散列表可用于缓存数据(例如,在Web服务器上)。 散列表非常适合用于防止重复。 参考资料: 图解算法
我们可以反证一下,如果这个公式成立,我计算无限个Key的散列值,那散列表底层的数组必须做到无限大才行。像业界比较著名的MD5、SHA等哈希算法,也无法完全避免这样的冲突。...再散列法 这种方式本质上是计算多次散列值,那就必然需要多个散列函数,在产生冲突时再使用另一个散列函数计算散列值,直到冲突不再发生,这种方法不易产生“聚集”,但增加了计算时间。 4....但是无论是什么,想要保证散列表的优点还是需要慎重考虑这个容器的选择。 ? 扩展阅读 1....拉链方式实现的链表中,其实我更倾向于使用双向链表,这样在删除一个元素的时候,双向链表的优势可以同时发挥出来,这样可以把散列表删除元素的时间复杂度降低为O(1)。 6....●程序猿修仙之路--算法之希尔排序! ●程序员修仙之路--算法之插入排序! ●程序员修仙之路--算法之选择排序! 互联网之路,菜菜与君一同成长 听说转发文章 会给你带来好运
应该将不同的输入映射到不同的数字。例如, 如果一个散列函数不管输入是什么都返回 1,它就不是好的散列函数。最理想的情况是,将不同的输入映射到不同的数字。...『缓存是一种常用的加速方式,所有大型网站都使用缓存,而缓存的数据则存储在散列表中!』 ? # 创建一个手机薄 # 添加联系人及其电话号码。通过输入联系人来获悉其电话号码。...因此在使用散列表时,避开最糟情况至关重要。为此,需要避免冲突。避免冲突的几个指标是: 较低的填装因子:填装因子 = 散列表包含的元素数/位置总数 ? 良好的散列函数:让数组中的值呈均匀分布。 ?...冲突很糟糕,应使用可以最大限度减少冲突的散列函数。 散列表的查找、插入和删除速度都非常快。 散列表适合用于模拟映射关系。 一旦填装因子超过 0.7,就该调整散列表的长度。...散列表可用于缓存数据(例如,在Web服务器上)。 散列表非常适合用于防止重复。 参考资料: 图解算法 ---- ---- ---- ----
least recentlly use 最少最近使用算法,就是使用的LinkedHashMap 会将内存控制在一定的大小内, 这个最大值可以自己定,超出最大值时会自动回收。...他内部是是一个LinkedHashMap存储外界的缓存对象,提供了get,put方法来操作,当缓存满了,lru会移除较早使用的缓存对象,把新的添加进来。...调用put插入新的对象也是存储在链表尾端,这样当内存缓存达到设定的最大值时,将链表头部的对象(近期最少用到的)移除。 内存中使用LRUCache是最合适的。...这个要求看起来合情合理,但是在真实的情况下,要想找到一个不同的 key 对应的散列值都不一样的散列函数,几乎是不可能的。即便像业界著名的MD5、SHA、CRC等哈希算法,也无法完全避免这种散列冲突。...对于查询操作,为了兼容了新、老散列表中的数据,我们先从新散列表中查找,如果没有找到,再去老的散列表中查找。 部分内容摘抄至极客时间《数据结构与算法之美》
散列函数 散列函数是这样的函数,无论它的输入是什么,它的输出都是一个数字。用专业术语来表示的话,散列函数将输入映射为数字。这个数字可以作为数组的索引,用来确定元素的存储位置。...散列表和链表联用 前段时间在看 Linux 内核源码的时候,有时候会看到散列表和链表的联合使用,散列表用来快速查找,而链表则使用 LRU 算法来维护(比如可查看文件系统缓存这一块的内容)。...那么接下来我们来看一下为什么将它们放在一起使用?以及散列表和链表的联用是什么样的? 在单纯使用链表实现 LRU 缓存淘汰算法时,我们是按照时间先后(最新访问的算是后)来维护链表结构。...因为查询数据的时候需要遍历链表,所以单纯的使用单链表的方式实现 LRU 缓存淘汰算法的时间复杂度为 O(n)。...因此,上述的三个操作的时间复杂度都是 O(1)。因此,将散列表和双向链表结合可以实现一个高效的、支持 LRU 缓存淘汰算法的缓存系统模型。 3.1.
一致性hash算法是什么? 一致性hash算法,是麻省理工学院1997年提出的一种算法,目前主要应用于分布式缓存当中。...计算方法:假设节点hash散列均匀(由于hash是散列表,所以并不是很理想),采用一致性hash算法,缓存节点从3个增加到4个时,会有0-33%的缓存失效,此外新增节点不会环节所有原有节点的压力。...使用一致性hash算法+虚拟节点这种情况下,缓存节点从3个变成4个,缓存失效率为25%,而且每个节点都平均的承担了压力。...一致性hash算法+虚拟节点的实现 原理理解了,实现并不难,主要是一些细节: hash算法的选择。Java代码不要使用hashcode函数,这个函数结果不够散列,而且会有负值需要处理。...这种计算Hash值的算法有很多,比如CRC32_HASH、FNV1_32_HASH、KETAMA_HASH等,其中KETAMA_HASH是默认的MemCache推荐的一致性Hash算法,用别的Hash算法也可以
答: filter包含了所有筛选条件匹配的对象,get返回筛选条件,筛选出多条或没有则报错 2、django中的大于小于是什么?.../范围缓存 任何一个由Django提供的页面将会被缓存,缓存市场可以在CACHE_MIDDLEWARE_SECONDS 中配置。...,默认是4K Log-maxsize 设置最大文件大小 Disable-logging 禁用请求日志记录 Pidfile 指定pid文件 Enable-threads 允许使用内嵌的语言启动线程...(2)Python大小写敏感,A和a是完全不同的。 (3)不能使用内部关键字来命名 11、redis是什么?保存什么样类型的数据?...Redis是一个开源的BSD许可的基于内存的数据结构存储器,可以用做数据库缓存和消息中间件。 它支持存储多种类型的数据结构, 字符串、散列、列表、集合、有序集合。 12、python的特性是什么?
散列表 算法图解第五章内容学习笔记 5.1 散列函数 特点:无论输入是什么数据,散列函数都输出一个数字。用专业术语来说明,散列函数“将输入映射到数字”。 ? 散列函数将输入映射为数字,这有何用途呢?...5.2 应用案例 (1) 将散列表用于查找 电话号码查找,给一个名字,输出他的号码。 (2)防止重复(投票时防止重复投票) ? (3)将散列表用作缓存 ?...然而,如果使用的散列函数很好,这些链表就不会很长! 5.4 性能 散列表的性能常数级别复杂度: ?...因此,在使用散列表时,避开最糟情况至关重要。为此,需要避免冲突。而要避免冲突,需要有: (1)较低的填装因子; (2)良好的散列函数。...(4)使用可以最大限度减少冲突的散列函数避免冲突。 (5)散列表适合用于模拟映射关系,可用于缓存数据、防止重复。 《算法图解》第五章散列表(字典)学习笔记,下一章“广度优先搜索”
领取专属 10元无门槛券
手把手带您无忧上云