随笔-159  评论-114  文章-7  trackbacks-0
  2010年4月29日
     摘要: 最近在funplus做游戏,进而研究了一个新型架构。之前做游戏都是自己使用java搭建架构,经过几年的积累确实也达到了最初的设想,多进程,进程内多线程,无锁,0延迟纯jdbc写库。对于单服架构来说,已经趋近于极致。今年小游戏盛行,如海盗来了,疯狂游戏那家公司,全部使用的都是go+mongodb实现的,因为go的语言级别支援高并发,这点是java无法比拟的。不过java开源项目多,有很多的高手铺垫了...  阅读全文
posted @ 2018-11-13 14:29 北国狼人的BloG 阅读(1522) | 评论 (0)编辑 收藏
好久不写blog了,我都已经从完美-》创业-》创业失败-》开心网-》创业-》创业失败-》蓝港-》funplus走了很多的历程了。
posted @ 2018-11-13 11:31 北国狼人的BloG 阅读(147) | 评论 (0)编辑 收藏
那我给你解释下RSA吧,尽量让你看懂:
*RSA是非对称加密体系,也就是说加密用一个公钥,解密用一个私钥,这2个密钥不同,这点非常非常重要。

其实RSA非常简洁,但很美

流程
1,寻找2个大的素数p,q  n=p*q=33  N=(p-1)*(q-1)=20
公钥e一般是3 私钥d要通过公钥e去算出来
e*d=1(mod N) 就是说e和d的乘积模N得1 也就是e和d关于模N互为逆元
3*7=1(mod 20) 可知d=7

加密的明文设为M 加密后的密文设为c
加密过程:C=M^e(mod n)
解密过程:M=C^d(mod n)

举个具体的例子 假如M=2
加密过程:C=2^3(mod 33)=8(mod 33)
解密过程:M=8^7(mod 33)=2097152(mod 33)=2(mod 33) 可以看出和和本来的明文是相同的。

原理可以理解为 M=M^(ed)  (mod n)
本例中 e*d=21  也就是是M^21次方等于M
RSA这个特性是数论中的费马定理推出的

在讲讲细节 比如楼主加密的是26的字母 就当明文的值是从1到26
就拿n=33说吧 加密后的密文的值是1到33 这很正常
但是解密后 一定和明文的值相同 也就是1到26

实际情况中 公钥e是公开的 私钥d是保密的
比如甲要给乙发个东西 乙的公钥由于是公开的 所以甲知道 但甲不知道乙的私钥
甲先用乙的公钥加密  之后 这个密文只能用乙的私钥 由于乙的私钥是保密的 只有他自己知道 所以保证了安全

RSA最大的安全问题是 n的分解 只要把n分解为p*q 则N=(p-1)(q-1)
根据 e*d=1(mod N) 就可以通过e算出d 那么私钥都被人算出来了 也就没安全性而言了
不过可惜的是 大数分解是一个单向的函数 你算知道p,q算n很容易,但是知道n算出p,q相当难

强调一句 n是加密解密用的 N是知道e算d的

楼主也没说你要干嘛 想看懂就这么多
如果要实现这个算法:
必须知道2点:
1.p,q这个两个大素数的生成,这牵扯到素性检验,数论中是一章的内容,没法和你展开
2.取模运算,由于加密解密过程可能取一个数的几十次方的模数,所以这个必须用简便的算法来化解复杂度,也就是模重复平方算法。

如果要编程中使用,太容易了
去下个dll
在java中 直接有可用于RSA的类 相当容易


 

对称加密算法,非对称加密算法 

 
 

常见的加密算法可以分成三类,对称加密算法,非对称加密算法和Hash算法。

对称加密

指加密和解密使用相同密钥的加密算法。对称加密算法的优点在于加解密的高速度和使用长密钥时的难破解性。假设两个用户需要使用对称加密方法加密然后交换数据,则用户最少需要2个密钥并交换使用,如果企业内用户有n个,则整个企业共需要n×(n-1) 个密钥,密钥的生成和分发将成为企业信息部门的恶梦。对称加密算法的安全性取决于加密密钥的保存情况,但要求企业中每一个持有密钥的人都保守秘密是不可能的,他们通常会有意无意的把密钥泄漏出去——如果一个用户使用的密钥被入侵者所获得,入侵者便可以读取该用户密钥加密的所有文档,如果整个企业共用一个加密密钥,那整个企业文档的保密性便无从谈起。

常见的对称加密算法有DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和AES

非对称加密

指加密和解密使用不同密钥的加密算法,也称为公私钥加密。假设两个用户要加密交换数据,双方交换公钥,使用时一方用对方的公钥加密,另一方即可用自己的私钥解密。如果企业中有n个用户,企业需要生成n对密钥,并分发n个公钥。由于公钥是可以公开的,用户只要保管好自己的私钥即可,因此加密密钥的分发将变得十分简单。同时,由于每个用户的私钥是唯一的,其他用户除了可以可以通过信息发送者的公钥来验证信息的来源是否真实,还可以确保发送者无法否认曾发送过该信息。非对称加密的缺点是加解密速度要远远慢于对称加密,在某些极端情况下,甚至能比非对称加密慢上1000倍。

常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)

Hash算法

Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。

常见的Hash算法有MD2、MD4、MD5、HAVAL、SHA

加密算法的效能通常可以按照算法本身的复杂程度、密钥长度(密钥越长越安全)、加解密速度等来衡量。上述的算法中,除了DES密钥长度不够、MD2速度较慢已逐渐被淘汰外,其他算法仍在目前的加密系统产品中使用

posted @ 2012-03-15 15:37 北国狼人的BloG 阅读(1145) | 评论 (0)编辑 收藏

千橡与我,一个公司与员工之间就像恋人一样,从最早的相识,相爱,拼搏,挽留,平淡,最终不再继续走下去。

其实都还相爱,但必须面对现实,不再会被记忆和离开时产生的痛苦蒙蔽自己的双眼。

posted @ 2011-08-28 13:49 北国狼人的BloG 阅读(1159) | 评论 (0)编辑 收藏
netstat -nlpt 看80端口有没有httpd服务
ps aux | grep httpd 看有没有httpd进程

locate httpd

service httpd status

service httpd configtest
posted @ 2011-01-19 16:26 北国狼人的BloG 阅读(1097) | 评论 (0)编辑 收藏

javac

 

用法:javac <选项> <源文件>
其中,可能的选项包括:
  -g                                                       生成所有调试信息
  -g:none                                             不生成任何调试信息
  -g:{lines,vars,source}                    只生成某些调试信息
  -nowarn                                            不生成任何警告
  -verbose                                           输出有关编译器正在执行的操作的消息
  -deprecation                                    输出使用已过时的 API 的源位置
  -classpath <路径>                          指定查找用户类文件的位置
  -cp <路径>                                       指定查找用户类文件的位置
  -sourcepath <路径>                       指定查找输入源文件的位置
  -bootclasspath <路径>                  覆盖引导类文件的位置
  -extdirs <目录>                               覆盖安装的扩展目录的位置
  -endorseddirs <目录>                   覆盖签名的标准路径的位置
  -d <目录>                                        指定存放生成的类文件的位置
  -encoding <编码>                          指定源文件使用的字符编码
  -source <版本>                              提供与指定版本的源兼容性
  -target <版本>                                 生成特定 VM 版本的类文件
  -version                                            版本信息
  -help                                                 输出标准选项的提要
  -X                                                      输出非标准选项的提要
  -J<标志>                                          直接将 <标志> 传递给运行时系统

jar


用法:jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...
选项:
    -c  创建新的存档
    -t  列出存档内容的列表
    -x  展开存档中的命名的(或所有的〕文件
    -u  更新已存在的存档
    -v  生成详细输出到标准输出上
    -f  指定存档文件名
    -m  包含来自标明文件的标明信息
    -0  只存储方式;未用ZIP压缩格式
    -M  不产生所有项的清单(manifest〕文件
    -i  为指定的jar文件产生索引信息
    -C  改变到指定的目录,并且包含下列文件:
如果一个文件名是一个目录,它将被递归处理。
清单(manifest〕文件名和存档文件名都需要被指定,按'm' 和 'f'标志指定的相同顺序。
示例1:将两个class文件存档到一个名为 'classes.jar' 的存档文件中:
       jar cvf classes.jar Foo.class Bar.class
示例2:用一个存在的清单(manifest)文件 'mymanifest' 将 foo/ 目录下的所有
           文件存档到一个名为 'classes.jar' 的存档文件中:
       jar cvfm classes.jar mymanifest -C foo/ .

java



用法: java [-选项] 类 [参数...]
           (执行一个类)
   或者 java [-选项] -jar jar文件 [参数...]
           (执行一个jar文件)
其中,可能的选项包括:
    -client       选择 "client" VM(ginger547:应该是指Virtual Machine)
    -server     选择 "server" VM
    -hotspot      与 "client" VM同义  [不赞成]
                  默认情况的VM是client.
    -cp <一个文件夹和zip/jar文件组成的类搜索路径>
    -classpath <一个文件夹和zip/jar文件组成的类搜索路径>
                 一个由文件夹,JAR压缩文件,或者ZIP压缩文件组成的用来搜索类的列表
    -D<名字>=<值>
                  设置一个系统属性
    -verbose[:class|gc|jni]
                  使详细输出变的可用
    -version      打印产品版本然后退出
    -version:<值>
                  只运行指定版本
    -showversion  打印产品版本后继续
    -jre-restrict-search | -jre-no-restrict-search
                  在版本搜索的时候,包含/排除用户私人的JRE
    -? -help      打印帮助信息
    -X            打印非标准选项帮助
    -ea[:<包名>...|:<类名>]
    -enableassertions[:<包名>...|:<类名>]
                 使断言可用
    -da[:<包名>...|:<类名>]
    -disableassertions[:<包名>...|:<类名>]
                  是断言不可用
    -esa | -enablesystemassertions
                  使系统级断言可用
    -dsa | -disablesystemassertions
                  使系统级断言不可用
    -agentlib:<库名>[=<选项>]
                  加载本地代理库<库名>,例如. -agentlib:hprof
                  同时可查看, -agentlib:jdwp=help和 -agentlib:hprof=help
    -agentpath:<路径名>[=<选项>]
                  通过全路径名来加载本地代理库
    -javaagent:<jar路径>[=<选项>]
                 加载Java编程语言代理,可查看 java.lang.instrument

posted @ 2010-12-09 12:55 北国狼人的BloG 阅读(1896) | 评论 (0)编辑 收藏
http://game-develop.net/blog/?p=17
posted @ 2010-12-01 13:33 北国狼人的BloG 阅读(263) | 评论 (0)编辑 收藏

select a.id,a.nickname from t_player a , t_player b where a.id != b.id and a.nickname = b.nickname

查询重复数据 都列出来

select id,nickname from t_player group by nickname having count(*) > 1;

查询所有重名的数据 只列出不同的。


如果想删除相关数据,那样非得要用in了。最好写程序,用prepareStatement去更新,in是不能用索引的,所以超级慢,所以程序优化相关数据库的操作是很有必要的。
posted @ 2010-08-19 17:27 北国狼人的BloG 阅读(1132) | 评论 (0)编辑 收藏
这个软件又好用,又实用,能缩放,比Captivate 好用多了。

posted @ 2010-06-29 16:58 北国狼人的BloG 阅读(1190) | 评论 (0)编辑 收藏

 传统我们都是定一个类型,带T的

public class RandomSelection<T> {

  
private java.util.Random random = new Random();

  
private ArrayList<T> list;

  
public RandomSelection() {

     list 
= new ArrayList<T>();

  }


  
public void add(T element) {

     list.add(element);

  }


  
public T getRandomElement() {

     
int index = random.nextInt(list.size());

     
return list.get(index);

  }



}


直接来使用。当我们new RandomSelection<String>()  new RandomSelection<Integer>() 的时候,里面的方法的类型,也就确定了。

public interface ISomeReason<extends Enum<X>> {

   
public X getImplClassType();

}

实现一个子类。这里看到继承是传入了接口泛型中的X参数,参数就是实现类自己的类型。

public enum ATypeReason implements ISomeReason<ATypeReason> {

   ABC(
1),
   DEF(
2),

   ;
   
int index;

   
private ATypeReason(int param)
   
{
      
this.index = param;
   }


   
public int getIndex()
   
{
       
return this.index;
   }


   @Override
   
public ATypeReason getImplClassType() {
      
return this
   }


}

你也可以直接实现,不传入X,那么在使用这个类型的实例去传入某一个指定类型的方法参数时,会提示错误,不利于代码健壮性。

public class MainTest {

   
public static void useATypeReason(ISomeReason<ATypeReason> reason)
{
    sysout(reason.getImplClassType().getIndex());
}


   
//ATypeReason的类型没有指定泛型参数适用于掉这个接口
   public static void dontCareParamType(ISomeReason<?> reason)
   
{
      sysout(reason.getImplClassType());
      
//不能调用
       sysout(reason.getImplClassType().getIndex());
   }


}

你可以把ISomeReason接口定义如下,更严格。

public interface ISomeReason<extends Enum<E> & ISomeReason<E>> {

   
public E type();

}

posted @ 2010-06-29 14:08 北国狼人的BloG 阅读(1117) | 评论 (0)编辑 收藏
-Xms256m -Xmx512m
posted @ 2010-06-04 18:32 北国狼人的BloG 阅读(845) | 评论 (0)编辑 收藏
CountDownLatch使得使用CountDownLatch.await()的线程(当前线程)阻塞直到所有其它拥有CountDownLatch的线程执行完毕(countDown()结果为0)。例子如下:


第18行:endLatch.await()使得主线程(main)阻塞直到endLatch.countDown()为零才继续执行,在每个线程执行完毕的时候都调用一下countDown()(第37行),所以当所有线程都执行完毕后countDown()变为零,这个时候主线程开始继续执行。

运行结果如下:(每次运行的结果可能不同)

可以试试,把第18行注释掉,执行结果如下:(每次的运行结果可能不同)


可以看到所有的线程并没有执行完毕就打印出了"All threads are finished."
posted @ 2010-05-15 14:45 北国狼人的BloG 阅读(1206) | 评论 (0)编辑 收藏
装了linux 到虚拟机就要实现文件传送和下载

使用ssh     securecrt  rz 上传 sz 下载

vi /etc/ssh/sshd_config

Port 22
Protocol 2
PermitRootLogin yes
PasswordAuthentication yes

/etc/init.d/sshd restrat

service sshd status

netstat -an|grep 22

发现没有端口22,日阿


解决方法:
______________________________________
一、开启SSH
以root用户登录Linux,打开终端,运行: /etc/init.d/sshd restrat
______________________________________
二、关闭防火墙
1.在终端运行 setup
2,.选择 firewall 回车
3.按tab键切换到disablede项,然后按空格键选择,然后再按tab键切换到ok,按空格件选择
4.按tab键切换到quit,按空格件选择
然后用客户端ssh登录Linux
______________________________________
三、关闭防火墙的另一种方式
/etc/init.d/iptables stop
______________________________________
补充:
红旗linux的某些版本,不允许root用户远程登陆的,需要修改设置#vi /etc/ssh/sshd_config 中
PermitRootLogin no
#这就不允许root用户远程登录,要修改成PermitRootLogin yes 并重启sshd服务才行的
#service sshd restart



再拿SecureCRT 连接,必能连。


VMWARE 采用HOST ONLY ,先保证能Ping通。

posted @ 2010-05-06 11:37 北国狼人的BloG 阅读(925) | 评论 (0)编辑 收藏
 改一个文件
 /etc/inittab
 把这一行,5改成3
id:3:initdefault:
 然后重启机器,就好了
posted @ 2010-05-05 18:56 北国狼人的BloG 阅读(172) | 评论 (0)编辑 收藏

今天看到一个as3 的性能tip
取反(Sign flipping using NOT or XOR)


另人奇怪的是这个居然快了300%!

i = -i;
//相当于:
i = ~i + 1;
//或者
i = (i ^ -1) + 1;


但对位操作有点生疏了。

其实就是     0010      正2    取反 变成 1101    但计算是以补码保存的。所以真值是什么?求反+1,按道理,真值求反+1是补码,应该逆操作,-1求反,但他妈的二进制牛鼻之处,先-1求反,跟求反+1竟然是一样的。所以补码再次进行求反+1就是真值了。


这下你明白了么?再不明白,你就看下面的,看完还不明白,就不要搞计算机了。



在计算机内,定点数有3种表示法:原码、反码和补码

所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

   反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

1、原码、反码和补码的表示方法

(1)    原码:在数值前直接加一符号位的表示法。

例如:      符号位  数值位

[+7]原=   0    0000111  B

[-7]原=   1    0000111  B

     注意:a. 数0的原码有两种形式:

             [+0]原=00000000B    [-0]原=10000000B

           b. 8位二进制原码的表示范围:-127~+127

(2)反码:

     正数:正数的反码与原码相同。

     负数:负数的反码,符号位为“1”,数值部分按位取反。

例如:     符号位 数值位

     [+7]反=  0   0000111  B

     [-7]反=  1   1111000  B

注意:a. 数0的反码也有两种形式,即

         [+0]反=00000000B

         [- 0]反=11111111B

      b. 8位二进制反码的表示范围:-127~+127

(3)补码的表示方法

1)模的概念:把一个计量单位称之为模或模数。例如,时钟是以12进制进行计数循环的,即以12为模。在时钟上,时针加上(正拨)12的整数位或减去(反拨)12的整数位,时针的位置不变。14点钟在舍去模12后,成为(下午)2点钟(14=14-12=2)。从0点出发逆时针拨10格即减去10小时,也可看成从0点出发顺时针拨2格(加上2小时),即2点(0-10=-10=-10+12=2)。因此,在模12的前提下,-10可映射为+2。由此可见,对于一个模数为12的循环系统来说,加2和减10的效果是一样的;因此,在以12为模的系统中,凡是减10的运算都可以用加2来代替,这就把减法问题转化成加法问题了(注:计算机的硬件结构中只有加法器,所以大部分的运算都必须最终转换为加法)。10和2对模12而言互为补数。

同理,计算机的运算部件与寄存器都有一定字长的限制(假设字长为8),因此它的运算也是一种模运算。当计数器计满8位也就是256个数后会产生溢出,又从头开始计数。产生溢出的量就是计数器的模,显然,8位二进制数,它的模数为28=256。在计算中,两个互补的数称为“补码”。

2)补码的表示:

    正数:正数的补码和原码相同。

    负数:负数的补码则是符号位为“1”,数值部分按位取反后再在末位(最低位)加1。也就是“反码+1”。

例如:       符号位 数值位

      [+7]补=   0   0000111  B

      [-7]补=   1   1111001  B

补码在微型机中是一种重要的编码形式,请注意:

a.             采用补码后,可以方便地将减法运算转化成加法运算,运算过程得到简化。正数的补码即是它所表示的数的真值,而负数的补码的数值部份却不是它所表示的数的真值。采用补码进行运算,所得结果仍为补码。

b.            与原码、反码不同,数值0的补码只有一个,即       [0]补=00000000B。

c.             若字长为8位,则补码所表示的范围为-128~+127;进行补码运算时,应注意所得结果不应超过补码所能表示数的范围。

2.原码、反码和补码之间的转换

由于正数的原码、补码、反码表示方法均相同,不需转换。

在此,仅以负数情况分析。

(1)    已知原码,求补码。

例:已知某数X的原码为10110100B,试求X的补码和反码。

解:由[X]原=10110100B知,X为负数。求其反码时,符号位不变,数值部分按位求反;求其补码时,再在其反码的末位加1。

1  0  1  1  0  1  0  0   原码

1  1  0  0  1  0  1  1   反码,符号位不变,数值位取反

                     1   +1

1  1  0  0  1  1  0  0   补码

故:[X]补=11001100B,[X]反=11001011B。

(2)    已知补码,求原码。

分析:按照求负数补码的逆过程,数值部分应是最低位减1,然后取反。但是对二进制数来说,先减1后取反和先取反后加1得到的结果是一样的,故仍可采用取反加1 有方法。

例:已知某数X的补码11101110B,试求其原码。

解:由[X]补=11101110B知,X为负数。求其原码表示时,符号位不变,数值部分按位求反,再在末位加1。

1  1  1  0  1  1  1  0   补码

1  0  0  1  0  0  0  1   符号位不变,数值位取反

                     1   +1

1  0  0  1  0  0  1  0   原码

1.3.2  有符号数运算时的溢出问题

请大家来做两个题目:

两正数相加怎么变成了负数???
1)(+72)+(+98)=?

0 1 0 0 1 0 0 0 B    +72

     +  0 1 1 0 0 0 1 0 B    +98

        1 0 1 0 1 0 1 0 B    -42

两负数相加怎么会得出正数???
2)(-83)+(-80)=?

1 0 1 0 1 1 0 1 B    -83

     +  1 0 1 1 0 0 0 0 B    -80

        0 1 0 1 1 1 0 1 B    +93

   思考:这两个题目,按照正常的法则来运算,但结果显然不正确,这是怎么回事呢?

   答案:这是因为发生了溢出。

如果计算机的字长为n位,n位二进制数的最高位为符号位,其余n-1位为数值位,采用补码表示法时,可表示的数X的范围是   -2n-1≤X≤2n-1-1

当n=8时,可表示的有符号数的范围为-128~+127。两个有符号数进行加法运算时,如果运算结果超出可表示的有符号数的范围时,就会发生溢出,使计算结果出错。很显然,溢出只能出现在两个同符号数相加或两个异符号数相减的情况下。

对于加法运算,如果次高位(数值部分最高位)形成进位加入最高位,而最高位(符号位)相加(包括次高位的进位)却没有进位输出时,或者反过来,次高位没有进位加入最高位,但最高位却有进位输出时,都将发生溢出。因为这两种情况是:两个正数相加,结果超出了范围,形式上变成了负数;两负数相加,结果超出了范围,形式上变成了正数。

而对于减法运算,当次高位不需从最高位借位,但最高位却需借位(正数减负数,差超出范围),或者反过来,次高位需从最高位借位,但最高位不需借位(负数减正数,差超出范围),也会出现溢出。

在计算机中,数据是以补码的形式存储的,所以补码在c语言的教学中有比较重要的地位,而讲解补码必须涉及到原码、反码。本部分演示作何一个整数的原码、反码、补码。过程与结果显示在列表框中,结果比较少,不必自动清除,而过程是相同的,没有必要清除。故需设清除各部分及清除全部的按钮。测试时注意最大、最小正负数。用户使用时注意讲解不会溢出:当有一个数的反码的全部位是1才会溢出,那么它的原码是10000...,它不是负数,故不会溢出。

    在n位的机器数中,最高位为符号位,该位为零表示为正,为一表示为负;其余n-1位为数值位,各位的值可为零或一。当真值为正时,原码、反码、补码数值位完全相同;当真值为负时,原码的数值位保持原样,反码的数值位是原码数值位的各位取反,补码则是反码的最低位加一。注意符号位不变。

      总结:提示信息不要太少,可“某某数的反码是某某”,而不是只显示数值。

posted @ 2010-04-29 15:52 北国狼人的BloG 阅读(831) | 评论 (1)编辑 收藏