我是靠谱客的博主 标致犀牛,最近开发中收集的这篇文章主要介绍由异或实现两个数的交换到RAID技术的数据恢复,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言

这篇博文源于在新浪微博上看到SinaAppEngine发的一条“一张图了解普通程序员、文艺程序员和2B程序员的区别”(原微博见点击打开链接)。里面提到文艺程序员采用两数异或的方法处理交换,自己在处理这个问题没想到。于是乎,抱着学习的心态,查找了一点详细的资料以解心头之惑。而且,顺藤摸瓜地无意间看见了RAID技术中数据恢复的异曲同工的处理方法。以下是个人整理的一点拙见,权当记笔记和给同样有疑问的人一点帮助。若有不当之处,或进一步补充,欢迎各位留言!

 

异或实现两数交换

 

void swap(int &a, int &b)
{
a ^= b;
b ^= a;
a ^= b;
}

 

上述代码能够实现a和b的数值交换。之所以能实现交换的原理如下:

"^"异或操作的基本原理是“同0异1”,譬如,a是十进制的5,b是十进制的12,按照异或操作运算如下:

 

a = 0101(a的二进制)
b = 1100(b的二进制)
#异或后
c = 1001(十进制9)

 

c中为1的位是a和b中不相同的位异或的结果,为0的位是a和b中相同的位异或的结果。

基于这两个规律:

1.任何一个二进制数与1异或后都会变成相反数。(如0^1=1,1^1=0)

2.任何一个二进制数与0异或后都会保持不变。(如0^0=0,1^0=1)

c中为1的部分是a和b中不同的,0的部分是相同的。那么,a异或c的结果就是a和b不同的部分发生变化。由于二进制只有两种状态,因此a就变成b了。

 

a = 0101
c = 1001
#异或后
b = 1100


RAID磁盘阵列中利用异或思想进行数据恢复

RAID(Redundant Arrays of Inexpensive Disk),磁盘阵列,有“价格便宜具有冗余能力的磁盘阵列”之意,是把相同的数据存储在多个硬盘的不同地方的方法。原理是利用数组方式来做磁盘组,配合数据分散排列的设计,提升数据的安全性。详见RAID百度百科点击打开链接

其中,对RAID5(RAID分级的一种)进行分析。

 

如上图,数据A,B,C,D分为块状(如数据 A,分为A1,A2,A3...Ap)分散分布在四个磁盘上,其中Ap为校验块。Xp的计算公式为:Xp=X1^X2^X3(X = A,B,C)。

加入Xp校验块且按以上分布排列的好处:当一个数据块出错时,可以利用剩余的数据块和校验块来恢复,提高了可靠性。算法如下:

一般地,P为校验块,利用旧数据(假设是正确的)生产P,当新数据Di出错或缺失,可利用P和其余的数据D来恢复。

利用异或特性,X^X=0,X^0=X,X^X^Y=Y.

P=D1^D2^D3^...^Dn ( 1 <= i <= n)

Di= P^D1^D2^D3^...^Dn (not include Di) 

所以,在一块盘掉线时,RAID正常工作。例如上图,当Disk0掉线,A1,B1,C1可以通过上面公式,由软件计算出来。

A1 = Ap^A2^A3;

B1 = Bp^B2^B3;

C1 = Cp^C2^C3;

当然,如果有两块掉线的话就没办法了。

 

引用资料:

1.http://blog.sina.com.cn/s/blog_67146a750100t9f3.html

2.http://baike.baidu.com/view/1367898.htm

3.http://bbs.chinaunix.net/thread-777230-1-1.html

最后

以上就是标致犀牛为你收集整理的由异或实现两个数的交换到RAID技术的数据恢复的全部内容,希望文章能够帮你解决由异或实现两个数的交换到RAID技术的数据恢复所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部