IT技术博客大学习 共学习 共进步
首页 / isnowfy
IT 2014-04-21 12:45:28 / 累计浏览 3,280

lock free的理解

这篇文章帮读者厘清了一个常见误解:很多人以为“无锁”(lock free)就是指程序不使用互斥锁,但实际上这个概念与“用不用锁”并无直接关系。作者指出,lock free的正确定义是:程序能够保证在所有线程中,至少有一个线程可以持续推进,而不会互相阻塞。这意味着即使某个线程挂掉,整个程序的执行流依然能够向前。 文章用一个典型的无锁循环代码举例——两个线程不断交替修改同一个变量,结果却可能互相卡死,这恰恰说明“不用锁”未必就是 lock free。相反,使用锁也可能实现 lock free 的特性,关键在于设计是否保证了系统整体的进展性。 最后,作者提到在实际编码中,lock free 的实现通常依赖 CAS(Compare and Swap)这类硬件支持的原子操作,从而在避免传统锁开销的同时,保障并发安全与性能。

IT 2013-06-17 23:45:27 / 累计浏览 4,120

cpp智能指针的简单实现

这篇讲的是如何从零开始实现一个C++智能指针。文章直指C++没有垃圾回收导致的内存管理痛点——手动配对`new`和`delete`极易出错和内存泄漏,随后切入智能指针如何通过引用计数来自动化这一过程。 作者的实现核心在于一个巧妙的设计:使用一个在栈上自动管理生命周期的包装类`Ptr`,其内部持有一个指向堆上辅助类`SmartPtr`的指针。这个辅助类负责记录引用计数和实际的数据。当`Ptr`对象被复制时,引用计数增加;当其析构时,引用计数减少。只有当引用计数降为零,意味着没有`Ptr`实例再指向它时,辅助类及其管理的内存才会被释放。 这种“栈对象包装堆对象”的思路,正是智能指针将语言特性(栈自动回收)与手动内存管理相结合的关键。文章通过一段可运行的代码清晰地展示了引用计数的增减时机,让抽象的原理变得直观。理解了这个手动实现,也就真正理解了智能指针在C++内存模型中的运作基石。

IT 2013-05-01 22:37:49 / 累计浏览 4,060

在线协同编辑的实现

这篇讲的是如何自己动手实现一个类似Google Doc的多人实时协同编辑器。文章从多人编辑同一文档必然面临的“冲突”问题切入,拆解出四个核心步骤:计算修改、服务器合并、同步状态和移动光标。 作者重点介绍了核心的冲突解决方案——**操作转换(Operational Transformation,OT)算法**。比如用户A插入文本、用户B删除文本时,服务器会动态调整后续操作的位置,确保所有人的视图最终一致。计算文本差异的部分,则借鉴了经典的动态规划算法,并推荐了Google开源的diff-match-patch库。 文章不仅梳理了理论路径,还给出了一个完整的实现范例:作者已将自己写的编辑器部署到SAE上,并开源了全部代码。对于想理解实时协作背后技术细节的开发者来说,这是一份从原理到实践的清晰指南。

IT 2012-12-24 22:47:37 / 累计浏览 5,280

网络协议简介

这篇讲的是网络协议分层模型和核心协议。作者从经典的OSI七层模型和更实用的TCP/IP四层模型对比出发,梳理了从物理层到应用层的数据流转过程。 文章的重点落在对网络层的剖析上。它详细拆解了IPv4和IPv6的数据包报文头结构,比如IPv4的IHL字段如何定义头部长度,IPv6如何通过更简洁的头部和128位地址来优化设计。同时,也点明了ICMP、IPsec等协议在网络层的角色。 除了重点讲网络层,文章也覆盖了传输层的TCP/UDP和应用层的HTTP、FTP等常见协议。最后,作者还提到了一个容易被忽略的socks5协议,解释了它在五层和七层模型中不同的定位,以及作为代理协议的实用性。整体上,文章以协议分层为脉络,兼顾了原理细节和实际应用。

IT 2012-12-24 22:45:27 / 累计浏览 5,520

查找第K小的元素

这篇讲的是如何高效地从无序数组中找到第K小的元素,这是一个经典的选择问题。 文章先梳理了常规思路:最直接的是先排序再取,但复杂度O(nlogn)较高。利用选择排序或堆排序可以优化到O(kn)或O(nlogk),而借鉴快速排序的思想——每次选择一个基准值,将数组分为两部分,然后递归地在目标区间查找——可以将平均复杂度降到O(n)。作者指出,快速排序思想的致命弱点在于基准值(pivot)选择不当会导致最坏情况O(n²)。 文章的核心在于介绍了一种能保证最坏情况也是O(n)的优化算法:**中位数的中位数(Median of Medians)**。具体做法是将数组每5个元素分为一组,先找出每组的中位数,再递归地从这n/5个中位数中找出中位数,用它作为最终基准值。这个策略能保证每次划分后,目标区间至少缩短一定比例(如30%),从而通过递推关系证明其最坏复杂度稳定在O(n)。 作者不仅给出了算法的理论分析,还附上了完整的Python实现代码,清晰地展示了如何将分组、找组中位数和主选择过程结合起来。最后,文章点出这个稳定的基准值选择策略,同样可以用来优化快速排序,将其最坏情况复杂度提升至O(nlogn)。

IT 2012-12-24 22:43:04 / 累计浏览 7,040

字符编码和中文乱码小叙

这篇讲的是字符编码从ASCII到UTF-8的演进历程,以及由此引发的中文乱码问题。作者从早期计算机只支持英文的ASCII编码说起,谈到欧洲语言扩展出的ISO8859-1,再到为解决中文等复杂文字而诞生的GB2312、GBK等国标编码,最后引出了致力于一统天下的Unicode及其存储实现UTF-8。 文章重点对比了在中文环境下最常见的两种编码:GBK和UTF-8。它指出了一个典型的“乱码陷阱”:Windows系统常用兼容GB2312的ANSI编码,而Linux等系统则普遍采用UTF-8。这种不一致,正是跨平台处理中文文件时频繁出现乱码的根源。 对于开发者,文章强调在编写Web程序时必须确保数据库、程序文件、网页声明(如``)以及数据库连接(如对MySQL执行`set names`)的编码统一。虽然文中以GBK为例说明了如何配置,但最终的建议是拥抱UTF-8——因为它已成为国际标准,与主流Linux服务器生态契合度更高,是更面向未来的稳妥选择。

IT 2012-12-24 22:40:39 / 累计浏览 3,980

数论的应用-RSA公钥算法

这篇讲的是RSA公钥算法背后的数学之美。作者从伟大的数学家欧拉切入,引出了现代非对称加密的基石——RSA算法。文章首先点明了对称加密的局限,随后介绍了1976年公钥密码思想的诞生,以及1977年RSA算法的正式提出。 核心部分,文章深入浅出地拆解了RSA所依赖的数论工具:欧拉函数用于计算与某数互质的数的个数,而欧拉定理(费马小定理的推广)则为算法的数学正确性提供了保证。随后,文章分步展示了RSA密钥生成与加解密的全过程:如何选取两个大素数p和q来构造模数n,并由此推导出公钥e和私钥d;以及如何用公钥加密、私钥解密。 为了让理论落地,文中还用了一个具体数字例子(M=52, p=17, q=11, e=7, d=23)演示了整个加密解密流程,让抽象公式变得清晰可感。最终,文章回归数学原理,简要说明了为何这样构造能实现解密的正确性。 整篇文章将深奥的数论概念与实际的密码学应用串联起来,展现了从纯理论到关键技术的奇妙旅程,让你理解为什么这个看似无用的数学分支,最终能成为守护互联网安全的隐形卫士。

IT 2012-12-24 22:38:04 / 累计浏览 4,200

P和NP那些事

这篇讲的是计算机科学中P、NP、NP完全(NPC)与NP难(NP-hard)这几个核心概念。很多人误以为NP就是“非P”,文章一开始就澄清了这一点:NP(非确定性多项式时间)问题指的是那些“能在多项式时间内被验证解”的问题,而P(多项式时间)问题自然属于NP。 作者用一个生动的比喻解释了NP的核心:非确定型图灵机可以“猜”出一个解(比如哈密顿路径),然后快速验证其正确性。接着,文章引入了“规约”这一关键工具,并指出Cook发现了所有NP问题都可规约到SAT问题,由此引出NP完全问题——NP中最困难的一类,它需同时满足“是NP问题”且“所有NP问题都可规约到它”这两个条件。 文章还以SAT、2-SAT(P)与3-SAT(NPC)为例,具体说明了概念间的差异,并列举了旅行商问题等经典NPC问题。最后,作者提及了对P≠NP证明尝试的看法,认为这可能需要现有理论体系之外的突破。全文从澄清误解入手,层层拆解概念间的逻辑关系,为理解这个理论计算机科学的核心难题提供了清晰的脉络。

IT 2012-12-23 23:22:09 / 累计浏览 5,080

谈谈SVD和LSA

这篇讲的是SVD(奇异值分解)和LSA(隐含语义分析)之间的关系。作者首先拆解了LSA的核心思想:它是一种主题模型,认为词语背后由潜在主题驱动。比如“计算机”和“电脑”在传统词向量空间中无关,但在LSA看来它们同属一个主题,因此包含它们的文章也相关,这突破了表面词汇的限制。 而SVD正是实现LSA的关键数学工具。文章从特征值与特征向量这些基础概念切入,为理解SVD如何分解文档-词矩阵、提取潜在语义结构做了铺垫。作者也点出SVD的广泛应用,比如它同样是PCA(主成分分析)和图像压缩的技术基础。整篇文章从数学基础讲到实际应用,清晰地勾勒出SVD作为通用分解方法,如何催生了LSA这一文本分析利器。

IT 2012-12-19 23:30:27 / 累计浏览 3,460

基于用户的协同过滤和皮尔逊相关系数

这篇文章聚焦于推荐系统中的经典算法——协同过滤,并深入比较了基于用户与基于物品两种实现路径的核心差异。作者指出,从大量实验效果看,基于用户的协同过滤通常表现更优。其关键在于,这种算法的核心思想是“找到与你相似的用户,将他们喜欢的东西推荐给你”,而实现这一点的关键,就是准确计算用户之间的相关性。 文章通过一个具体的评分矩阵例子,生动展示了如何操作。例如,用户a和b对物品X、Y、Z的评分向量非常接近,因此当b未评价物品R时,系统就能将a高度评价的R推荐给b。接下来,文章深入到数学层面,解释了如何量化这种“相似性”。它首先介绍了将用户评分视为向量、计算其夹角余弦值的经典方法(即余弦相似度),随后引出了另一种更常用且效果通常更好的度量方式——皮尔逊相关系数。虽然文章片段未完全展示其公式,但明确了其目标:通过对比两个用户对相同物品的评分趋势(即协方差与各自标准差的比值)来评估线性相关程度,从而更精准地度量用户兴趣的相似性。 总体而言,这篇文章从概念到具体计算,清晰地剖析了基于用户协同过滤的算法逻辑。它不仅解释了“为什么”,更通过实例和公式指引了“怎么做”,对于想理解推荐系统核心原理的读者来说,是一篇内容扎实、脉络清晰的入门解析。

IT 2012-12-19 13:39:15 / 累计浏览 6,420

md5到md5破解的一些科普

这篇讲的是如何正确理解MD5这一经典哈希函数及其“被破解”事件。文章作者从MD5的多对一映射本质出发,解释了为何它是“不可逆”的,进而引出了密码学中关键的“碰撞”概念。 核心对比在于“无弱碰撞”与“无强碰撞”的区别。作者用生动的生日悖论说明,找到一对碰撞(强碰撞)的复杂度约为O(sqrt(m)),远低于遍历的O(m),这为攻击提供了理论可能性。文章重点阐述了王小云教授的突破性贡献:她找到的算法能比生日攻击更快地构造出强碰撞,而非通过密文反推明文。这并不意味着MD5可以直接“解密”,而是破坏了它在验证文件完整性或数字签名时的可靠性基础。 后续提到的“预测大选”实验,正是利用了快速构造前缀碰撞的技术,以一种巧妙的方式展示了算法漏洞的实际应用。最终文章落脚于现实影响:尽管MD5在部分安全场景已弃用,但其漏洞提醒我们,从非官方渠道下载文件时,仅比对MD5值已不足以保证安全。