2008年12月29日星期一

质量和能量

谷锐译 原文:Slaven


除了长度收缩和时间膨胀以外,相对论还有许多推论。其中最著名、最重要的是关于能量的。

能量有许多状态。任何运动的物体都因其自身的运动而具有物理学家所谓的“动能”。动能的大小和物体的运动速度及质量有关。(“质量”非常类似于“重量”,但并不完全相同)放在架子上的物体具有“引力势能”。因为如果架子被移掉,它就(由于引力)具有获得动能的可能。

热也是一种形式的能,其最终可以归结于组成物质的原子和分子的动能,此外还有许多其他形式的能。

把上述现象都和能量联系起来的原因,即它们之间的联系,是能量守恒定律。这个定律是说,如果我们把宇宙中全部的能量都加起来(我们可以用象焦耳或千瓦时这样的单位定量地描述能量),其总量永不改变。此即,能量从不会产生或消灭,尽管它们可以从一种形态转化为另一种形态。例如,汽车是一种可以将(在引擎的汽缸中的)热能转化为(汽车运动的)动能的设备;灯泡(可以)将电能转化为光能(这又是两种能的形式)。

爱因斯坦在他的相对论中发现了能量的另一种形式,有时被称作“静能量”。我已经指出一个运动物体由于其运动而具有了能量。但爱因斯坦发现,同样一个物体在其静止不动的时候同样具有能量。物体内静能量的数量依赖于其质量,并以公式E=mc2给出。

由于光速是如此之大的一个数,一个典型物体的静能量与其所具有的其他类型的能量根本不可相提并论。但这并不重要,因为日常生活中物体的静能量就是保持“安静”的状态,并且不会被转化成我们可以注意到的其他形式的能,如热能或动能。在核电站、原子武器和太阳中有相对很少一部分静质量被转化为其他形式的能,但对于大多数情况而言,静能量通常不会被注意到。

一个物体的动能和静能量的总和也可以用数学公式非常容易地表述如下:



注意,在日常的速度中,γ大约等于1。因此静、动能量之和近似等于单一的静能量。换句话说,在日常速度中,静能比动能大得多。然而,当速度非常接近光速时,γ可以比1大很多(静能量只与物体的质量有关,而与其运动与否无关)。这对于在芝加哥附近的费米实验室和瑞士边界的CERN实验室中(使用)粒子加速器的物理学家来说非常重要。

宇宙执法者的历险——微妙的时间

谷锐译 原文:Slaven


好,这就是我们刚刚看到的。我们已经发现在AD相对于EN参照系旅行中的时间膨胀。在EN参照系中,AD是运动的,因此AD的钟走得慢。结果是在此次飞行中EN的钟走了39小时,而AD的钟走了12小时。这常常使人们产生这样的问题:

相对于AD的系,EN是运动的,因此EN的钟应该走得慢。因此当AD到达B行星的时候,他的钟走的时间比EN的长。谁对?长还是短?

好问题。当你问这个问题的时候,我知道你已经开始进入情况了。在开始解释之前,我必须声明在前文所叙述的事情都是对的。在我所描述的情况下,AD可以及时拿到解药。现在让我们来解释这个徉谬。这与我尚未提及的“同时性”有关。相对论的一个推论是:同一参照系中的两个同时(但不同地点)发生的事件相对于另一个参照系不同时发生。

让我们来研究一些同时发生的事件。
首先,让我们假设EN和AD在AD离开A行星时同时按下秒表。按照EN的表,这趟B行星之旅将花费39小时。换言之,EN的表在AD到达B行星时读数为39小时。因为时间膨胀,AD的表与此同时读数为12.2小时。即,以下三件事情是同时发生的:

1、 EN的表读数为39
2、 AD到达B行星
3、 AD的表读数为12.2

这些事件在EN的参照系中是同时发生的。

现在在AD的参照系中,上述三个事件不可能同时发生。更进一步,因为我们知道EN的表一定以参数γ减慢(此处γ大约为3.2),我们可以计算出当AD的表读数为12.2小时的时候,EN的表的读数为12.2/3.2=3.8小时。因此在AD的系中,这些事情是同时发生的:

1、 AD到达B行星
2、 AD的钟的读数为1.2 (应该是12.2吧)
3、 EN的钟的读数为3.2 (应该是3.8吧)

前两项在两个系中都是相同的,因为它们在同一地点——B行星发生。两个同一地点发生的事件要么同时发生,要么不同时发生,在这里,参照系不起作用。

从另一个角度看待此问题可能会对你有所帮助。你所感兴趣的事件是从AD离开A行星到AD到达B行星。一个重要的提示:AD在两个事件中都存在。也就是说,在AD的参照系中,这两个事件在同一地点发生。由此,AD参照系的事件被称作“正确时间”,所有其他系中的时间都将比此系中的更长(参见时间膨胀原理)。不管怎样,如果你对AD历险中的时间膨胀感到迷惑,希望这可以使之澄清一些。如果你原本不糊涂,那么希望你现在也不。

宇宙执法者的历险

谷锐译 原文:Slaven


宇宙执法者AD在A行星上被邪恶的EN博士所擒。EN博士给AD喝了一杯13小时后发作的毒酒,并告诉AD解药在距此40,000,000,000公里远的B行星上。AD得知此情况后立即乘上其0.95倍光速的星际飞船飞往B星,那么:

AD能即使到达B星并取得解药吗?

我们做如下的计算:
A、B两行星之间的距离为40,000,000,000公里。飞船的速度是1,025,000,000公里/小时。把这两个数相除,我们得到从A行星到B行星需要39小时。
那么AD必死无疑。

等一下!这只对于站在A行星上的人而言。由于毒药在AD的体内是要经过新陈代谢(才能发作)的,我们必须从AD的参照系出发研究这一问题。我们可以用两种方法做这件事情,它们将得到相同的结论。

1. 设想一个大尺子从A行星一致延伸到B行星。这个尺子有40,000,000,000公里长。然而,从AD的角度而言,这个尺子以接近光速飞过他身边。我们已经知道这样的物体会发生长度收缩现象。在AD的参照系中,从A行星到B行星的距离以参数γ在收缩。在95%的光速下,γ的值大约等于3.2。因此AD认为这段路程只有12,500,000,000公里远(400亿除以3.2)。我们用此距离除以AD的速度,得到12.2小时,AD将提前将近1小时到达B行星!

2. A行星上的观察者会发现AD到达B需要花费大约39小时时间。然而,这是一个膨胀后的时间。我们知道AD的“钟”以参数γ(3.2)变慢。为了计算AD参照系中的时间,我们再用39小时除以3.2,得到12.2小时。(也)给AD剩下了大约1小时(这很好,因为这给了AD20分钟时间离开飞船,另外20分钟去寻找解药)。

AD将生还并继续与邪恶战斗。

如果对上文中我的描述加以仔细研究,你会发现许多似是而非,非常微妙的东西。当你深入地思考它的时候,一般你最终将提出这样一个问题:“等一下,在AD的参照系中,EN的钟表走得更慢了,因此在AD的参照系中,宇宙旅行应花费更长的时间,而不是更短...

如果你对这个问题感兴趣或者觉得困惑,你可能应该看一下后文《宇宙执法者的历险——微妙的时间》。或者你可以相信我所说的话“如果你把所有的因果都弄清楚,那么所有(这些)都是正确的”并跳到《质量和能量》一章。
谷锐译 原文:Slaven

现在你可能会奇怪:为什么你在日常生活中从未注意到过长度收缩和时间膨胀效应?例如根据刚才我所说的,如果你驱车从俄荷马城到勘萨斯城再返回,那么当你到家的时候,你应该重新对表。因为当你驾车的时候,你的表应该比在你家里处于静止状态的表走得慢。如果到家的时候你的表现时是3点正,那么你家里的表都应该显示一个晚一点的时间。为什么你从未发现过这种情况呢?

答案是:这种效应显著与否依赖于你运动速度的快慢。而你运动得非常慢(你可能认为你的车开得很快,但这对于相对论来说,是极慢的)。长度收缩和时间膨胀的效果只有当你以接近光速运动的时候才能注意到。而光速约合186,300英里/秒(或3亿米/秒)。在数学上,相对论效应通常用一个系数加以描述,物理学家通常用希腊字母γ加以表示。这个系数依赖于物体运动的速度。例如,如果一根米尺(正确长度为1米)快速地从我们面前飞过,则它相对于我们的参照系的长度是1/γ米。如果一个钟从A点运动到B点要3秒钟,那么相对于我们的参照系,这个过程持续3/γ秒。


为了理解现实中为什么我们没有注意到相对论效应,让我们看一下(关于)γ的公式: 这里的关键是分母中的v2/c2。v是我们所讨论的物体的运动速度,c是光速。因为任何正常尺寸物体的速度远小于光速,所以v/c非常小;当我们将其平方后(所得的结果)就更小了。因此对于所有实际生活中通常尺寸的物体而言,γ的值就是1。所以对于普通的速度,我们通过乘除运算后得到的长度和时间没有变化。为了说明此事,下面有一个对应于不同速度的γ值表。(其中)最后一列是米尺在此速度运动时的长度(即1/γ米)。



第一列中c仍旧表示光速。.9c等于光速的十分之九。为了便于参照举个例子:“土星五号”火箭的飞行速度大约是25,000英里/小时。你看,对于任何合理的速度,γ几乎就是1。因此长度和时间几乎没有变化。在生活中,相对论效应只是发生在科幻小说(其中的飞船远比“土星五号”快得多)和微观物理学中(电子和质子常被加速到非常接近光速的速度)。在从芝加哥飞往丹佛的路上,这种效应是不会显现出来的。

时间和空间

谷锐译 原文:Slaven

时间和空间

我们得出一个自相矛盾的结论。我们用来将速度从一个参照系转换到另一个参照系的“常识相对论”和爱因斯坦的“光在所有惯性系中速度相同”的假设相抵触。只有在两种情况下爱因斯坦的假设才是正确的:要么距离相对于两个惯性系不同,要么时间相对于两个惯性系不同。
实际上,两者都对。第一种效果被称作“长度收缩”,第二种效果被称作“时间膨胀”。


长度收缩:

长度收缩有时被称作洛伦茨(Lorentz)或洛伦茨-弗里茨格拉德(FritzGerald)收缩。在爱因斯坦之前,洛伦茨和弗里茨格拉德就求出了用来描述(长度)收缩的数学公式。但爱因斯坦意识到了它的重大意义并将其植入完整的相对论中。这个原理是:
参照系中运动物体的长度比其静止时的长度要短

下面用图形说明以便于理解:


上部图形是尺子在参照系中处于静止状态。一个静止物体在其参照系中的长度被称作他的“正确长度”。一个码尺的正确长度是一码。下部图中尺子在运动。用更长、更准确的话来讲:我们相对于某参照系,发现它(尺子)在运动。长度收缩原理指出在此参照系中运动的尺子要短一些。

这种收缩并非幻觉。当尺子从我们身边经过时,任何精确的试验都表明其长度比静止时要短。尺子并非看上去短了,它的确短了!然而,它只在其运动方向上收缩。下部图中尺子是水平运动的,因此它的水平方向变短。你可能已经注意到,两图中垂直方向的长度是一样的。


时间膨胀:

所谓的时间膨胀效应与长度收缩很相似,它是这样进行的:

某一参照系中的两个事件,它们发生在不同地点时的时间间隔
总比同样两个事件发生在相同地点的时间间隔长。

这更加难懂,我们仍然用图例加以说明:


图中两个闹钟都可以用于测量第一个闹钟从A点运动到B点所花费的时间。然而两个闹钟给出的结果并不相同。我们可以这样思考:我们所提到的两个事件分别是“闹钟离开A点”和“闹钟到达B点”。在我们的参照系中,这两个事件在不同的地点发生(A和B)。然而,让我们以上半图中闹钟自身的参照系观察这件事情。从这个角度看,上半图中的闹钟是静止的(所有的物体相对于其自身都是静止的),而刻有A和B点的线条从右向左移动。因此“离开A点”和“到达B点”着两件事情都发生在同一地点!(上半图中闹钟所测量的时间称为“正确时间”)按照前面提到的观点,下半图中闹钟所记录的时间将比上半图中闹钟从A到B所记录的时间更长。

此原理的一个较为简单但不太精确的陈述是:运动的钟比静止的钟走得更慢。最著名的关于时间膨胀的假说通常被成为双生子佯谬。假设有一对双胞胎哈瑞和玛丽,玛丽登上一艘快速飞离地球的飞船(为了使效果明显,飞船必须以接近光速运动),并且很快就返回来。我们可以将两个人的身体视为一架用年龄计算时间流逝的钟。因为玛丽运动得很快,因此她的“钟”比哈瑞的“钟”走得慢。结果是,当玛丽返回地球的时候,她将比哈瑞更年轻。年轻多少要看她以多快的速度走了多远。

时间膨胀并非是个疯狂的想法,它已经为实验所证实。最好的例子涉及到一种称 为"介子"的亚原子粒子。一个介子衰变需要多少时间已经被非常精确地测量过。无论怎样,已经观测到一个以接近光速运动的介子比一个静止或缓慢运动的介子的寿命要长。这就是相对论效应。从运动的介子自身来看,它并没有存在更长的时间。这是因为从它自身的角度看它是静止的;只有从相对于实验室的角度看该介子,我们才会发现其寿命被“延长”或“缩短”了。?

应该加上一句:已经有很多很多的实验证实了相对论的这个推论。(相对论的)其他推论我们以后才能加以证实。我的观点是,尽管我们把相对论称作一种“理论”,但不要误认为相对论有待于证实,它(实际上)是非常完备的。

爱因斯坦第二假设

谷锐译 原文:Slaven

19世纪中页人们对电和磁的理解有了一个革命性的飞跃,其中以詹姆斯.麦克斯韦(James Maxwell)的成就为代表。电和磁两种现象曾被认为毫不相关,直到奥斯特(Oersted)和安培(Ampere)证明电能产生磁;法拉弟(Faraday)和亨利(Henry)证明磁能产生电。现在我们知道电和磁的关系是如此紧密,以致于当物理学家对自然力进行列表时,常常将电和磁视为一件事。

麦克斯韦的成就在于将当时所有已知的电磁知识集中于四个方程中:




(如果你没有上过理解这些方程所必需的三到四个学期的微积分课程,那么就坐下来看它们几分钟,欣赏一下其中的美吧)

麦克斯韦方程对于我们的重要意义在于,它除了将所有人们已知的电磁知识加以描述以外,还揭示了一些人们不知道的事情。例如:构成这些方程的电磁场可以以振动波的形式在空间传播。当麦克斯韦计算了这些波的速度后,他发现它们都等于光速。这并非巧合,麦克斯韦(方程)揭示出光是一种电磁波。

我们应记住的一个重要的事情是:光速直接从描述所有电磁场的麦克斯韦方程推导而来。

现在我们回到爱因斯坦。

爱因斯坦的第一个假设是所有惯性参照系中的物理规律相同。他的第二假设是简单地将此原则推广到电和磁的规律中。这就是,如果麦克斯韦假设是自然界的一种规律,那么它(和它的推论)都必须在所有惯性系中成立。这些推论中的一个就是爱因斯坦的第二假设:
光在所有惯性系中速度相同

爱因斯坦的第一假设看上去非常合理,他的第二假设延续了第一假设的合理性。但为什么它看上去并不合理呢?

火车上的试验

为了说明爱因斯坦第二假的合理性,让我们来看一下下面这副火车上的图画。
火车以每秒100,000,000米/秒的速度运行,Dave站在车上,Nolan站在铁路旁的地面上。Dave用手中的电筒“发射”光子。



光子相对于Dave以每秒300,000,000米/秒的速度运行,Dave以100,000,000米/秒的速度相对于Nolan运动。因此我们得出光子相对于Nolan的速度为400,000,000米/秒。

问题出现了:这与爱因斯坦的第二假设不符!爱因斯坦说光相对于Nolan参照系的速度必需和Dave参照系中的光速完全相同,即300,000,000米/秒。那么我们的“常识感觉”和爱因斯坦的假设那一个错了呢?

好,许多科学家的试验(结果)支持了爱因斯坦的假设,因此我们也假定爱因斯坦是对的,并帮大家找出常识相对论的错误之处。

记得吗?将速度相加的决定来得十分简单。一秒钟后,光子已移动到Dave前300,000,000米处,而Dave已经移动到Nolan前100,000,000米处。其间的距离不是400,000,000米只有两种可能:

1、 相对于Dave的300,000,000米距离对于Nolan来说并非也是300,000,000米
2、 对Dave而言的一秒钟和对Nolan而言的一秒钟不同

尽管听起来很奇怪,但两者实际上都是正确的。

爱因斯坦第一假设

谷锐译 原文:Slaven

全部狭义相对论主要基于爱因斯坦对宇宙本性的两个假设。

第一个可以这样陈述:
所有惯性参照系中的物理规律是相同的

此处唯一稍有些难懂的地方是所谓的“惯性参照系”。举几个例子就可以解释清楚:

假设你正在一架飞机上,飞机水平地以每小时几百英里的恒定速度飞行,没有任何颠簸。一个人从机舱那边走过来,说:“把你的那袋花生扔过来好吗?”你抓起花生袋,但突然停了下来,想道:“我正坐在一架以每小时几百英里速度飞行的飞机上,我该用多大的劲扔这袋花生,才能使它到达那个人手上呢?”

不,你根本不用考虑这个问题,你只需要用与你在机场时相同的动作(和力气)投掷就行。花生的运动同飞机停在地面时一样。

你看,如果飞机以恒定的速度沿直线飞行,控制物体运动的自然法则与飞机静止时是一样的。我们称飞机内部为一个惯性参照系。(“惯性”一词原指牛顿第一运动定律。惯性是每个物体所固有的当没有外力作用时保持静止或匀速直线运动的属性。惯性参照系是一系列此规律成立的参照系。

另一个例子。让我们考查大地本身。地球的周长约40,000公里。由于地球每24小时自转一周,地球赤道上的一点实际上正以每小时1600公里的速度向东移动。然而我敢打赌说Steve Young在向Jerry Rice(二人都是橄榄球运动员。译者注)触地传球的时候,从未对此担心过。这是因为大地在作近似的匀速直线运动,地球表面几乎就是一个惯性参照系。因此它的运动对其他物体的影响很小,所有物体的运动都表现得如同地球处于静止状态一样。

实际上,除非我们意识到地球在转,否则有些现象会是十分费解的。(即,地球不是在沿直线运动,而是绕地轴作一个大的圆周运动)

例如:天气(变化)的许多方面都显得完全违反物理规律,除非我们对此(地球在转)加以考虑。另一个例子。远程炮弹并非象他们在惯性系中那样沿直线运动,而是略向右(在北半球)或向左(在南半球)偏。(室外运动的高尔夫球手们,这可不能用于解释你们的擦边球)对于大多数研究目的而言,我们可以将地球视为惯性参照系。但偶尔,它的非惯性表征将非常严重(我想把话说得严密一些)。

这里有一个最低限度:惯性系是一个静止或作匀速直线运动的系。爱因斯坦的第一假设使此类系中所有的物理规律都保持不变。运动的飞机和地球表面的例子只是用以向你解释这是一个平日里人们想都不用想就能作出的合理假设。谁说爱因斯坦是天才?

2008年12月17日星期三

oracle 表中数据导出到CSV文件

工作中常常导数据到CSV文件中,
很多情况下由于数据量太大不能利用PL/SQL的查出EXPORT到CSV文件的功能。
可以用命令模式下的spool


set verify off
set head off
set feedback off
set pages 0
set termout off
set echo off
spool e:\temp10.csv
select 't.callid,t.callerno,t.callbegin,t.calleeno,t.num' from dual
union all
select t.callid||','||t.callerno||','||to_char(t.callbegin,'yyyy-mm-dd hh24:mi:ss')||','||t.calleeno||','||t.num from temp10 t;
spool off
就将TEMP10中的表数据导入到了temp10.csv中。

2008年12月14日星期日

讨厌自己

非常讨厌自己

2008年12月11日星期四

动态SQL,过程中常用

execute immediate v_sqlStr into v_count using p_startdate,p_enddate,p_startdate,p_enddate;

oracle 取随机N条记录

明白了,应该
select * from(select * from table t order by DBMS_RANDOM.VALUE)where rownum<5
而不是
select * from table t
where rownum<5order by DBMS_RANDOM.VALUE

2008年11月26日星期三

现代密码学的一些基础理论

本文简要地介绍了现代密码学的一些基础理论,供参考。

  1 加密技术概述

  一个密码系统的安全性只在于密钥的保密性,而不在算法的保密性。

  对纯数据的加密的确是这样。对于你不愿意让他看到这些数据(数据的明文)的人,用可靠的加密算法,只要破解者不知道被加密数据的密码,他就不可解读这些数据。

  但是,软件的加密不同于数据的加密,它只能是“隐藏”。不管你愿意不愿意让他(合法用户,或 Cracker)看见这些数据(软件的明文),软件最终总要在机器上运行,对机器,它就必须是明文。既然机器可以“看见”这些明文,那么 Cracker,通过一些技术,也可以看到这些明文。

  于是,从理论上,任何软件加密技术都可以破解。只是破解的难度不同而已。有的要让最高明的 Cracker 忙上几个月,有的可能不费吹灰之力,就被破解了。

  所以,反盗版的任务(技术上的反盗版,而非行政上的反盗版)就是增加 Cracker 的破解难度。让他们花费在破解软件上的成本,比他破解这个软件的获利还要高。这样 Cracker 的破解变得毫无意义——谁会花比正版软件更多的钱去买盗版软件 ?

  2 密码学简介

  2.1 概念

  (1) 发送者和接收者

  假设发送者想发送消息给接收者,且想安全地发送信息:她想确信偷听者不能阅读发送的消息。

  (2) 消息和加密

  消息被称为明文。用某种方法伪装消息以隐藏它的内容的过程称为加密,加了密的消息称为密文,而把密文转变为明文的过程称为解密。

  明文用M(消息)或P(明文)表示,它可能是比特流(文本文件、位图、数字化的语音流或数字化的视频图像)。至于涉及到计算机,P是简单的二进制数据。明文可被传送或存储,无论在哪种情况,M指待加密的消息。

  密文用C表示,它也是二进制数据,有时和M一样大,有时稍大(通过压缩和加密的结合,C有可能比P小些。然而,单单加密通常达不到这一点)。加密函数E作用于M得到密文C,用数学表示为:

  E(M)=C.

  相反地,解密函数D作用于C产生M

  D(C)=M.

  先加密后再解密消息,原始的明文将恢复出来,下面的等式必须成立:

  D(E(M))=M

  (3) 鉴别、完整性和抗抵赖

  除了提供机密性外,密码学通常有其它的作用:.

  (a) 鉴别

  消息的接收者应该能够确认消息的来源;入侵者不可能伪装成他人。

  (b) 完整性检验

  消息的接收者应该能够验证在传送过程中消息没有被修改;入侵者不可能用假消息代替合法消息。

  (c) 抗抵赖

  发送者事后不可能虚假地否认他发送的消息。

  (4) 算法和密钥

  密码算法也叫密码,是用于加密和解密的数学函数。(通常情况下,有两个相关的函数:一个用作加密,另一个用作解密)

  如果算法的保密性是基于保持算法的秘密,这种算法称为受限制的算法。受限制的算法具有历史意义,但按现在的标准,它们的保密性已远远不够。大的或经常变换的用户组织不能使用它们,因为每有一个用户离开这个组织,其它的用户就必须改换另外不同的算法。如果有人无意暴露了这个秘密,所有人都必须改变他们的算法。

  更糟的是,受限制的密码算法不可能进行质量控制或标准化。每个用户组织必须有他们自己的唯一算法。这样的组织不可能采用流行的硬件或软件产品。但窃听者却可以买到这些流行产品并学习算法,于是用户不得不自己编写算法并予以实现,如果这个组织中没有好的密码学家,那么他们就无法知道他们是否拥有安全的算法。

  尽管有这些主要缺陷,受限制的算法对低密级的应用来说还是很流行的,用户或者没有认识到或者不在乎他们系统中内在的问题。

  现代密码学用密钥解决了这个问题,密钥用K表示。K可以是很多数值里的任意值。密钥K的可能值的范围叫做密钥空间。加密和解密运算都使用这个密钥(即运算都依赖于密钥,并用K作为下标表示),这样,加/解密函数现在变成:

  EK(M)=C

  DK(C)=M.

  这些函数具有下面的特性:

  DK(EK(M))=M.

  有些算法使用不同的加密密钥和解密密钥,也就是说加密密钥K1与相应的解密密钥K2不同,在这种情况下:

  EK1(M)=C

  DK2(C)=M

  DK2 (EK1(M))=M

  所有这些算法的安全性都基于密钥的安全性;而不是基于算法的细节的安全性。这就意味着算法可以公开,也可以被分析,可以大量生产使用算法的产品,即使偷听者知道你的算法也没有关系;如果他不知道你使用的具体密钥,他就不可能阅读你的消息。

  密码系统由算法、以及所有可能的明文、密文和密钥组成的。

  基于密钥的算法通常有两类:对称算法和公开密钥算法。下面将分别介绍:

  2.2 对称密码算法

  对称算法有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。在大多数对称算法中,加/解密密钥是相同的。这些算法也叫秘密密钥算法或单密钥算法,它要求发送者和接收者在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加/解密。只要通信需要保密,密钥就必须保密。

  对称算法的加密和解密表示为:

  EK(M)=C

  DK(C)=M

  对称算法可分为两类。一次只对明文中的单个比特(有时对字节)运算的算法称为序列算法或序列密码。另一类算法是对明文的一组比特亚行运算,这些比特组称为分组,相应的算法称为分组算法或分组密码。现代计算机密码算法的典型分组长度为64比特——这个长度大到足以防止分析破译,但又小到足以方便使用(在计算机出现前,算法普遍地每次只对明文的一个字符运算,可认为是序列密码对字符序列的运算)。

  2.3 公开密码算法

  公开密钥算法(也叫非对称算法)是这样设计的:用作加密的密钥不同于用作解密的密钥,而且解密密钥不能根据加密密钥计算出来(至少在合理假定的长时间内)。之所以叫做公开密钥算法,是因为加密密钥能够公开,即陌生者能用加密密钥加密信息,但只有用相应的解密密钥才能解密信息。在这些系统中,加密密钥叫做公开密钥(简称公钥),解密密钥叫做私人密钥(简称私钥)。私人密钥有时也叫秘密密钥。为了避免与对称算法混淆,此处不用秘密密钥这个名字。

  用公开密钥K加密表示为

  EK(M)=C.

  虽然公开密钥和私人密钥是不同的,但用相应的私人密钥解密可表示为:

  DK(C)=M

  有时消息用私人密钥加密而用公开密钥解密,这用于数字签名(后面将详细介绍),尽管可能产生混淆,但这些运算可分别表示为:

  EK(M)=C

  DK(C)=M

  当前的公开密码算法的速度,比起对称密码算法,要慢的多,这使得公开密码算法在大数据量的加密中应用有限。

  2.4 单向散列函数

  单向散列函数 H(M) 作用于一个任意长度的消息 M,它返回一个固定长度的散列值 h,其中 h 的长度为 m 。

  输入为任意长度且输出为固定长度的函数有很多种,但单向散列函数还有使其单向的其它特性:

  (1) 给定 M ,很容易计算 h ;

  (2) 给定 h ,根据 H(M) = h 计算 M 很难 ;

  (3) 给定 M ,要找到另一个消息 M‘ 并满足 H(M) = H(M’) 很难。

  在许多应用中,仅有单向性是不够的,还需要称之为“抗碰撞”的条件:

  要找出两个随机的消息 M 和 M‘,使 H(M) = H(M’) 满足很难。

  由于散列函数的这些特性,由于公开密码算法的计算速度往往很慢,所以,在一些密码协议中,它可以作为一个消息 M 的摘要,代替原始消息 M,让发送者为 H(M) 签名而不是对 M 签名 。

  如 SHA 散列算法用于数字签名协议 DSA中。

  2.5 数字签名

  提到数字签名就离不开公开密码系统和散列技术。

  有几种公钥算法能用作数字签名。在一些算法中,例如RSA,公钥或者私钥都可用作加密。用你的私钥加密文件,你就拥有安全的数字签名。在其它情况下,如DSA,算法便区分开来了??数字签名算法不能用于加密。这种思想首先由Diffie和Hellman提出 。

  基本协议是简单的 :

  (1) A 用她的私钥对文件加密,从而对文件签名。

  (2) A 将签名的文件传给B。

  (3) B用A的公钥解密文件,从而验证签名。

  这个协议中,只需要证明A的公钥的确是她的。如果B不能完成第(3)步,那么他知道签名是无效的。

  这个协议也满足以下特征:

  (1) 签名是可信的。当B用A的公钥验证信息时,他知道是由A签名的。

  (2) 签名是不可伪造的。只有A知道她的私钥。

  (3) 签名是不可重用的。签名是文件的函数,并且不可能转换成另外的文件。

  (4) 被签名的文件是不可改变的。如果文件有任何改变,文件就不可能用A的公钥验证。

  (5) 签名是不可抵赖的。B不用A的帮助就能验证A的签名。

  在实际应用中,因为公共密码算法的速度太慢,签名者往往是对消息的散列签名而不是对消息本身签名。这样做并不会降低签名的可信性。

  注:本文由计算机专业相关教材整理

2008年11月24日星期一

发誓

2008年11月17日星期一

group by rollup 与 cube

oracle group by rollup 与 cube 语句.很有用的统计




Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。如果是ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。 grouping_id()可以美化效果:


Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。




除本文内容外,你还可参考:
分析函数参考手册: http://xsb.itpub.net/post/419/33028
分析函数使用例子介绍:http://xsb.itpub.net/post/419/44634

SQL> create table t as select * from dba_indexes;


表已创建。


SQL> select index_type, status, count(*) from t group by index_type, status;


INDEX_TYPE STATUS COUNT(*)
--------------------------- -------- ----------
LOB VALID 51
NORMAL N/A 25
NORMAL VALID 479
CLUSTER VALID 11


下面来看看ROLLUP和CUBE语句的执行结果。


SQL> select index_type, status, count(*) from t group by rollup(index_type, status);


INDEX_TYPE STATUS COUNT(*)
--------------------------- -------- ----------
LOB VALID 51
LOB 51
NORMAL N/A 25
NORMAL VALID 479
NORMAL 504
CLUSTER VALID 11
CLUSTER 11
566


已选择8行。


SQL> select index_type, status, count(*) from t group by cube(index_type, status);


INDEX_TYPE STATUS COUNT(*)
--------------------------- -------- ----------
566
N/A 25
VALID 541
LOB 51
LOB VALID 51
NORMAL 504
NORMAL N/A 25
NORMAL VALID 479
CLUSTER 11
CLUSTER VALID 11


已选择10行。


查询结果不是很一目了然,下面通过Oracle提供的函数GROUPING来整理一下查询结果。


SQL> select grouping(index_type) g_ind, grouping(status) g_st, index_type, status, count(*)
2 from t group by rollup(index_type, status) order by 1, 2;


G_IND G_ST INDEX_TYPE STATUS COUNT(*)
---------- ---------- --------------------------- -------- ----------
0 0 LOB VALID 51
0 0 NORMAL N/A 25
0 0 NORMAL VALID 479
0 0 CLUSTER VALID 11
0 1 LOB 51
0 1 NORMAL 504
0 1 CLUSTER 11
1 1 566


已选择8行。


这个查询结果就直观多了,和不带ROLLUP语句的GROUP BY相比,ROLLUP增加了对INDEX_TYPE的GROUP BY统计和对所有记录的GROUP BY统计。


也就是说,如果是ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。


下面看看CUBE语句。


SQL> select grouping(index_type) g_ind, grouping(status) g_st, index_type, status, count(*)
2 from t group by cube(index_type, status) order by 1, 2;


G_IND G_ST INDEX_TYPE STATUS COUNT(*)
---------- ---------- --------------------------- -------- ----------
0 0 LOB VALID 51
0 0 NORMAL N/A 25
0 0 NORMAL VALID 479
0 0 CLUSTER VALID 11
0 1 LOB 51
0 1 NORMAL 504
0 1 CLUSTER 11
1 0 N/A 25
1 0 VALID 541
1 1 566


已选择10行。


和ROLLUP相比,CUBE又增加了对STATUS列的GROUP BY统计。


如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。


除了使用GROUPING函数,还可以使用GROUPING_ID来标识GROUP BY结果。


SQL> select grouping_id(index_type, status) g_ind, index_type, status, count(*)
2 from t group by rollup(index_type, status) order by 1;


G_IND INDEX_TYPE STATUS COUNT(*)
---------- --------------------------- -------- ----------
0 LOB VALID 51
0 NORMAL N/A 25
0 NORMAL VALID 479
0 CLUSTER VALID 11
1 LOB 51
1 NORMAL 504
1 CLUSTER 11
3 566


已选择8行。


SQL> select grouping_id(index_type, status) g_ind, index_type, status, count(*)
2 from t group by cube(index_type, status) order by 1;


G_IND INDEX_TYPE STATUS COUNT(*)
---------- --------------------------- -------- ----------
0 LOB VALID 51
0 NORMAL N/A 25
0 NORMAL VALID 479
0 CLUSTER VALID 11
1 LOB 51
1 NORMAL 504
1 CLUSTER 11
2 N/A 25
2 VALID 541
3 566


已选择10行。

grouping_id()可以美化效果:

select DECODE(GROUPING_ID(C1), 1, '合计', C1) D1,
DECODE(GROUPING_ID(C1, C2), 1, '小计', C2) D2,
DECODE(GROUPING_ID(C1, C2, C1 + C2), 1, '小计', C1 + C2) D3,
count(*),
GROUPING_ID(C1, C2, C1 + C2, C1 + 1, C2 + 1),
GROUPING_ID(C1)
from T2
group by rollup(C1, C2, C1 + C2, C1 + 1, C2 + 1);

===========================================================

1.报表合计专用的Rollup函数

销售报表

广州 1月 2000元

广州 2月 2500元

广州 4500元

深圳 1月 1000元

深圳 2月 2000元

深圳 3000元

所有地区 7500元



以往的查询SQL:

Select area,month,sum(money) from SaleOrder group by area,month

然后广州,深圳的合计和所有地区合计都需要在程序里自行累计


1.其实可以使用如下SQL:

Select area,month,sum(total_sale) from SaleOrder group by rollup(area,month)

就能产生和报表一模一样的纪录


2.如果year不想累加,可以写成

Select year,month,area,sum(total_sale) from SaleOrder group by year, rollup(month,area)

另外Oracle 9i还支持如下语法:

Select year,month,area,sum(total_sale) from SaleOrder group by rollup((year,month),area)


3.如果使用Cube(area,month)而不是RollUp(area,month),除了获得每个地区的合计之外,还将获得每个月份的合计,在报表最后显示。


4.Grouping让合计列更好读

RollUp在显示广州合计时,月份列为NULL,但更好的做法应该是显示为"所有月份"

Grouping就是用来判断当前Column是否是一个合计列,1为yes,然后用Decode把它转为"所有月份"

Select Decode(Grouping(area),1,'所有地区',area) area, Decode(Grouping(month),1,'所有月份',month), sum(money) From SaleOrder Group by RollUp(area,month);


2.对多级层次查询的start with.....connect by

比如人员组织,产品类别,Oracle提供了很经典的方法

SELECT LEVEL, name, emp_id,manager_emp_id FROM employee START WITH manager_emp_id is null CONNECT BY PRIOR emp_id = manager_emp_id;

上面的语句demo了全部的应用,start with指明从哪里开始遍历树,如果从根开始,那么它的manager应该是Null,如果从某个职员开始,可以写成emp_id='11'

CONNECT BY 就是指明父子关系,注意PRIOR位置

另外还有一个LEVEL列,显示节点的层次


3.更多报表/分析决策功能

3.1 分析功能的基本结构

分析功能() over( partion子句,order by子句,窗口子句)

概念上很难讲清楚,还是用例子说话比较好.


3.2 Row_Number 和 Rank, DENSE_Rank

用于选出Top 3 sales这样的报表

当两个业务员可能有相同业绩时,就要使用Rank和Dense_Rank

比如

金额 RowNum Rank Dense_Rank

张三 4000元 1 1 1

李四 3000元 2 2 2

钱五 2000元 3 3 3

孙六 2000元 4 3 3

丁七 1000元 5 5 4

这时,应该把并列第三的钱五和孙六都选进去,所以用Ranking功能比RowNumber保险.至于Desnse还是Ranking就看具体情况了。

SELECT salesperson_id, SUM(tot_sales) sp_sales, RANK( ) OVER (ORDER BY SUM(tot_sales) DESC) sales_rank FROM orders GROUP BY salesperson_id

3.3 NTILE 把纪录平分成甲乙丙丁四等

比如我想取得前25%的纪录,或者把25%的纪录当作同一个level平等对待,把另25%当作另一个Level平等对待

SELECT cust_nbr, SUM(tot_sales) cust_sales, NTILE(4) OVER (ORDER BY SUM(tot_sales) DESC) sales_quartile FROM orders GROUP BY cust_nbr ORDER BY 3,2 DESC;

NTITLE(4)把纪录以 SUM(tot_sales)排序分成4份.


3.4 辅助分析列和Windows Function

报表除了基本事实数据外,总希望旁边多些全年总销量,到目前为止的累计销量,前后三个月的平均销量这样的列来参考.

这种前后三个月的平均和到目前为止的累计销量就叫windows function, 见下例

SELECT month, SUM(tot_sales) monthly_sales, SUM(SUM(tot_sales)) OVER (ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) max_preceeding FROM orders GROUP BY month ORDER BY month;

SELECT month, SUM(tot_sales) monthly_sales, AVG(SUM(tot_sales)) OVER (ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) rolling_avg FROM orders GROUP BY month ORDER BY month;

Windows Function的关键就是Windows子句的几个取值

1 PRECEDING 之前的一条记录

1 FOLLOWING 之后的一条记录

UNBOUNDED PRECEDING 之前的所有记录

CURRENT ROW 当前纪录


4.SubQuery总结

SubQuery天天用了,理论上总结一下.SubQuery 分三种

1.Noncorrelated 子查询 最普通的样式.

2.Correlated Subqueries 把父查询的列拉到子查询里面去,头一回cyt教我的时候理解了半天.

3.Inline View 也被当成最普通的样式用了.


然后Noncorrelated 子查询又有三种情况

1.返回一行一列 where price < (select max(price) from goods )

2.返回多行一列 where price>= ALL (select price from goods where type=2)

or where NOT price< ANY(select price from goods where type=2)

最常用的IN其实就是=ANY()

3.返回多行多列 一次返回多列当然就节省了查询时间

UPDATE monthly_orders SET (tot_orders, max_order_amt) = (SELECT COUNT(*), MAX(sale_price) FROM cust_order) DELETE FROM line_item WHERE (order_nbr, part_nbr) IN (SELECT order_nbr, part_nbr FROM cust_order c)

========================================
/*--------理解grouping sets
select a, b, c, sum( d ) from t
group by grouping sets ( a, b, c )

等效于

select * from (
select a, null, null, sum( d ) from t group by a
union all
select null, b, null, sum( d ) from t group by b
union all
select null, null, c, sum( d ) from t group by c
)
*/

2008年11月11日星期二

午睡醒来

每次醒来,心里都有一种说不出的痛处.一种必须面对事实的心情.