80. ArrayBlockingQueue阻塞队列

ArrayBlockingQueue阻塞队列有一系列方法,主要区别在异常操作时的反应,持有一把全局锁。用于存储队列元素的存储空间是预先分配的,使用过程中内存开销较小,适合已知最大存储容量的场景。适用于生产消费模型,平衡两边的处理速度。

方法 行为 表现
add 添加一个元素 如果队列已满抛出异常 IllegalStateException
element 返回头部元素 如果队列为空抛出异常 NoSuchElementException
offer 添加一个元素 成功返回 true, 如果队列已满返回 false
peek 返回头部元素 如果队列为空,返回 null
poll 删除并返回该元素 如果队列为空返回 null
put 添加一个元素 如果队列已满则阻塞
remove 删除并返回该元素 如果队列为空抛出异常 NoSuchElementException
take 删除并返回该元素 如果队列为空则阻塞

Read More

79. RSA

RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年7月首次在美国公布,当时他们三人都在麻省理工学院工作实习。RSA就是他们三人姓氏开头字母拼在一起组成的。

RSA是目前最有影响力和最常用的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。

今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战和质疑。

RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

PHP

<?php

/**
 * RSA加密PHP版本
 */
class RSA
{
    /**
     * 对字符串进行RSA加密
     *
     * @param string $channelPass 待加密字符串
     * @return bool|string 加密后十六进制字符串
     */
    public static function getSign($channelPass = '')
    {
        // 不同平台之间转化过的对等公钥文件
        $pubKeyFile = "file://" . dirname(__FILE__) . "/publickey.pem";
        // 读取公钥内容
        $pubKey = file_get_contents($pubKeyFile);
        /**
         * 从证书中提取公钥并准备使用
         * @link http://php.net/manual/zh/function.openssl-pkey-get-public.php
         */
        $res = openssl_pkey_get_public($pubKey);
        if ($res) {
            /**
             * 用公钥加密数据
             * @link http://php.net/manual/zh/function.openssl-public-encrypt.php
             */
            $opt = openssl_public_encrypt($channelPass, $result, $res);
            if ($opt) {
                /**
                 * 函数把包含数据的二进制字符串转换为十六进制值
                 * @link http://php.net/manual/zh/function.bin2hex.php
                 */
                return bin2hex($result);
            }
        }

        return false;
    }
}

echo RSA::getSign('Test password');
echo "\n\n";

Read More