RSA算法长文本加密

作者:bibodeng 发布于:2015-6-26 16:49 Friday 分类:编程技术

RSA是最常用的非对称加密算法,公钥用于加密,私钥用来解密。私钥还可以用来签名,公钥可以认证该签名。我们可以使用生成的公钥和密钥进行RSA的加密和解密,简单的文本加解密如下,主要思路就是,根据传入的密钥,构造Provider,然后使用Provider执行加解密操作。使用公钥加密完成后,可以转换成Base64编码,也可以保存在Byte[],响应地解密时需要传入Byte[]类型的密文。

//string...

阅读全文>>

标签: 算法 RSA 加密

评论(0) 引用(0) 浏览(1297)

用js实现快排加演示-js排程初探

作者:bibodeng 发布于:2013-10-25 8:27 Friday 分类:web开发

用js实现快排加演示

by bibodeng 2013-10-24

缘起

有很多时候,我们都是需要重新做一个轮子,才知道轮子究竟是什么样子的,然后就可以在下一次碰到这种情况时能够立马写出来,并且能写得很好。本来我打算写一个快排,然后在页面中进行演示,我知道已经有很牛的人实现过了,但是我做这个的时候,遇到了一些困难,使我想起了前段时间想要写某个锁机制队列的时候,后来发现...< q) // 需要排序的元素个数不为0 { x = partition(arr, p, q); // 对数组进行partion处理 qsort(arr, p, x-1); // x之前部分 x是该轮确定位置的元素 qsort(arr, x+1, q); // 2次递归 } };

var partition = function(arr, p, q)
{

    var tmp = 0,
        i   = p,
        j   = q + 1,
        base = arr[p];  // 首元素作为基准

    // 将数组分成两部分,大于base的,小于base的

    while (1)
    {

        while (arr[++i] <= base && i < q);

        while (arr[--j] >< total; i++)
    {
        myArr.push(parseInt((Math.random() * 450)));    // 0 - 450
    }

    // 绘制方格
    qsort(myArr, 0, myArr.length-1); 
});

为了能够体现出排序的可视化效果,我打算绘制一些小方格排列在一起,就像下面这样:

排序可视化

实现的代码并不麻烦,在ready中加入绘制方格的代码:

// 绘制方格
var str = '';
for (var j = 0; j < total; j++)
{
    str += "<li class='normal' style='height:"+myArr[j]+"px;'></li>< q) // 需要排序的元素个数不为0
    {
        x = partition(arr, p, q);   // 对数组进行partion处理

        setTimeout(function(){
            qsort(arr, p, x-1);     // x之前部分  x是该轮确定位置的元素
        }, 1000);

        setTimeout(function(){
            qsort(arr, x+1, q);     // 2次递归
        }, 2000);

    }

    console.log('after sort', arr);
};

并且setTimeout这东西,在循环下,是很耗费内存的,会导致页面奔溃,并且它之内将逻辑包围在一个函数参数里面,不太好。当把for循环换成setInterval调用时,元素操作效果倒是流畅了,但是排序结果却不正确了。原因是后续代码已经开始运行了。

异步的麻烦与解决办法

异步的麻烦,是真麻烦。我思考了一下,将排序算法和DOM操作混在一起是很野蛮的做法,没有做到数据加工和体现的分离。而当前状态又需要重绘,才能体现出其动态效果,但是重绘的代价也太大了,左思右想,没有想到好的解决办法,于是找到陈皓提到的日本程序员写的排序可视化,太强大了,效果也是一级棒,不过要细细剖析源码才知道它是如何实现的,这个改天再一探究竟,今天我要隆重介绍一下一个相当优雅的排程小程序,个人觉得写得相当优雅。

我们做很多编程工作时,往往想要同步(这里的同步指的是确定顺序,而不是不确定),例如在进行ajax请求时,回调结果往往要等一段时间才能返回,但是我们的程序的return却不知道要从哪里返回,如果在回调的外面,则等不到结果就返回了,如果在回调函数里面,则又返回不到正确的地方,这个时候就很有必要同步了。而一个排程的程序,对各个操作进行同步互斥,则可以让它们乖乖一个接一个按顺序执行,这就好比操作系统里面对资源的锁。具体可以参看myunlessor写的排程策略详解。直接上代码吧:

// 排程策略 - 全局定义
var schedule = (function (self) {
  var paused = false, // 标记状态
      queue  = [];     // 队列

  // 入队
  self.join = function (fn, params) {
    params = params || {};
    var args = [].concat(params.args);

    queue.push(function (_) {
      _.pause();
      setTimeout(function () {
        fn.apply(params.context || null, args);
        _.resume();
      }, params.delay || 1);
    });

    return exec();
  };

  self.pause = function () {
    paused = true;  // 忙碌
    return this;
  };

  // ready and call next
  self.resume = function () {
    paused = false; // 空闲
    setTimeout(exec, 1);
    return this;
  };

  function exec() {
    if (!paused && queue.length) {
      queue.shift()(self);  // 出队
      if (!paused) self.resume();
    }
    return self;
  }

  return self;
}(schedule || {})); // 立即执行,self就是schedule本身

我对着这个程序看了十来分钟,越看越有味道,从这个程序中可以看到javascript的很多good part,暂时没有看到缺陷,例如[],用成了活生生的队列,使用push和shift进行入队出队操作。还有闭包,直接返回一个self,本身参数传的是schedule,而schedule本身是刚刚定义的,需要赋值的,这一切看起来多么地神奇,还有返回this,强大的链式调用,有木有,额有点跑题了。下面我们就应用到我们的排序中:

var qsort =  function(arr, p, q)
{
    var x;
    if (p < q)  // 需要排序的元素个数不为0
    {
        x = partition(arr, p, q);   // 对数组进行partion处理

        schedule
        .join(qsort,{
            delay: 100,
            args: [arr, p, x-1]
        })
        .join(qsort, {
            delay: 100,
            args: [arr, x+1, q]
        });
    }
};

一切都相当优雅。当我打开浏览器测试时,发现,有了排程,而不是死板的setTimeout,动画变得流畅了很多。接下来的目标是接着优化partition里面的代码,使得这个过程也看起来很流畅。

var partition = function(arr, p, q)
{

    var tmp = 0,
        i   = p,
        j   = q + 1,
        base = arr[p];  // 首元素作为基准

    $list.attr('class', 'normal');
    schedule
    .join(showBase, {
        delay: 0,
        args: [p]
    });

    while (1)
    {

        while (arr[++i] <= base && i < q)
        {
            ;// 只要是小于base且没到结尾就一直前进
            schedule.
            join(moveSelectedRight,{
                delay: 50,
                args : [i]
            });
        }

        while (arr[--j] ><p class="readmore"><a href="http://www.bibodeng.com/?post=135">阅读全文&gt;&gt;</a></p>

标签: 算法 排序 js 异步 同步

评论(0) 引用(1) 浏览(2755)

堆排序复习

作者:bibodeng 发布于:2013-4-21 21:58 Sunday 分类:python

2013-04-21 翻阅《算法导论》

再谈堆排序

堆排序利用的特性——堆的数据结构特征:最大/最小 的元素总是在根处取得。

那么要利用根来排序,我们只需要保持堆的特性,然后每次把最后的元素与根交换,取出根元素就可以了。但是这个过程需要用到整堆,即保证这个数组能够形成堆的特征(这里对最大堆来讲):父节点总是比子节点要大。

整堆就是对这种“僭越”的清洗,说起来很残忍,其实就是如果比自己小...

阅读全文>>

标签: 算法 python 堆排序

评论(0) 引用(0) 浏览(2424)

【导论】有穷自动机字符串匹配

作者:bibodeng 发布于:2012-10-23 8:51 Tuesday 分类:技术交流

有穷自动机
 
定义一个状态的集合Q,而一个状态q通过一个转移函数δ则可转移到另外一个状态q', 而自动有一个初始状态,还会有一个接受状态,到达了接受状态则说明该一系列的输入时符号该自动机所确定的模式。在编译原理的课上,接触了有穷自动机,而正则表达式和有穷自动自动机是等价的,程序设计语言的词法则可以用正则表达式来定义。可见,有穷自动机用来做字符匹配那是再合适不过了。
 
一个简单的...

阅读全文>>

标签: 算法 字符串匹配 DFA 有穷自动机

评论(0) 引用(0) 浏览(2798)

字符串匹配——RK算法

作者:bibodeng 发布于:2012-10-21 0:09 Sunday 分类:技术交流

【RK算法】

RK字符串匹配算法,在思想上是很简单易懂的,将字符串当成是一串数字,可以进行计算,若其值相等,那么字符串也便相等了。字符串视为数字有一个好处那就是减少了运算,在前面“朴素的字符串匹配”中,我们可以看到,如果按照一个个比对的办法将会花费 m *(n -m+1)的时间,但是如果是数字的话,从 T = “125025”中要匹配P = “25”则可以按如下过程进行计算:

点击查看原图

1、开始从1进行匹配...

阅读全文>>

标签: 算法 字符串匹配 RK

评论(0) 引用(1) 浏览(2215)

字符串匹配——朴素的字符串匹配

作者:bibodeng 发布于:2012-10-9 9:03 Tuesday 分类:编程技术

字符串匹配一直是一个很常见的问题,小到查找某个单词,大到DNA的检测。而字符串的匹配算法也很有意思,特别是有穷自动机和KMP算法,十分地精巧,令人惊叹,在有KMP之前,用的就是朴素的方法。

 

朴素的字符串匹配,就是遍历整个被检测字符串,然后一个个字符进行比对,如果不匹配则移到下一格,继续与模式进行匹配。导论里面说明: 被检测的字符串为目标字符串,而匹配的依据就是模式。

其匹配原理如下图所示:

点击查看原图

...

阅读全文>>

标签: 算法 字符串匹配 朴素

评论(0) 引用(2) 浏览(2319)

编程珠玑——值得阅读

作者:bibodeng 发布于:2012-7-16 10:43 Monday 分类:编程技术

【编程珠玑】
想不到薄薄的200+页,居然能让我如此地狂笑不止,暗叹妙哉,手不释卷。对于学习计算机算法而言,有一点基础之后就可以翻翻这本“大师系列”的课外读物了。先说说里面的结构篇章,然后再说说它吸引我的地方。第一部分介绍了一些基础知识,但是读起来非常有趣,有些算法简直让人惊叹不已,而后面的编程练习也十分具有挑战性,这部分分为算法、数据结构、编写正确的程序、编程的次要问题。一一介绍了许多软件开发中非...

阅读全文>>

标签: 解题 算法 编程 珠玑 技术

评论(2) 引用(119) 浏览(18839)

一个简单的二叉查找树

作者:bibodeng 发布于:2012-5-17 22:12 Thursday 分类:技术交流

【编程珠玑】

看珠玑看了一半了,多是趁着闲着的时候看上几页,思考一下后面的问题。珠玑很薄,才两百来页,但是里面的一些技术却十分地实用,改天一定要好好整理一下,将写的程序和一些有趣的技术(编程思想,断言,数据表现形式)等话题展开探讨。很久没有写技术性的文字了,只是拿来简单的二叉查找树来练练手。

【二叉查找树】

二叉查找树是一种二叉树,由于其具有左子树的元素都小于根节点,右子树元素大于根节点的这种特性,故而...

阅读全文>>

标签: 算法 BST

评论(0) 引用(1) 浏览(2744)

编程的最低境界——徒手写排序

作者:bibodeng 发布于:2012-4-24 8:13 Tuesday 分类:编程技术

【编程的最低境界】

自从学习了高级语言C/C++之后,接着就学习了一些简单的算法。最近看《算法导论》,又重新学习了一下之前的最最基础的算法——“排序”。排序虽然基础,能根据各种排序方法的思想徒手写出排序算法来,是编程的最低阶段,排序都写不好,就别谈开发好的软件了。虽然其他博客上到处都是排序的文章和代码,但是我觉得还是要写一写,记录下思考的过程,同时给自己动手的机会。有兴趣的同学可以翻翻《算法导论》1...

阅读全文>>

标签: 算法 排序 基本功

评论(0) 引用(1) 浏览(2422)

从装配线到DNA比对——神器动态规划

作者:bibodeng 发布于:2012-4-24 8:08 Tuesday 分类:编程技术

【前言】
对于一个问题,我们如果可以枚举所有的解,那么这个解空间我们是知道的。那么如何在解空间里面找到最优解呢?这时有一个非常好的方法,从底向上地构造整个解,而每一步都是从地层寻求最优解,这样就能保证在最终得到的一定是最优解。这就是最优子结构,有这种结构的问题,通常都可以用动态规划的办法来寻求最优解。而且它是从小规模(子问题)到大规模问题的构造,而常常这样的解法能够用一张表直观地表现出来。表中的元素...

阅读全文>>

标签: 算法 编程 DNA 动态规划

评论(0) 引用(3) 浏览(2740)

Powered by emlog 京ICP备16017775