DateTimeFormatter

使用旧的Date对象时,我们用SimpleDateFormat进行格式化显示。使用新的LocalDateTime或ZonedDateTime时,我们要进行格式化显示,就要使用DateTimeFormatter。 和SimpleDateFormat不同的是,DateTimeFormatter不但是不变对象,它还是线程安全的。线程的概念我们会在后面涉及到。现在我们只需要记住:因为SimpleDateF
DateTimeFormatter

Instant

我们已经讲过,计算机存储的当前时间,本质上只是一个不断递增的整数。Java提供的System.currentTimeMillis()返回的就是以毫秒表示的当前时间戳。 这个当前时间戳在java.time中以Instant类型表示,我们用Instant.now()获取当前时间戳,效果和System.currentTimeMillis()类似: import java.time.*; public c
Instant

最佳实践

由于Java提供了新旧两套日期和时间的API,除非涉及到遗留代码,否则我们应该坚持使用新的API。 如果需要与遗留代码打交道,如何在新旧API之间互相转换呢? 旧API转新API 如果要把旧式的Date或Calendar转换为新API对象,可以通过toInstant()方法转换为Instant对象,再继续转换为ZonedDateTime: // Date -> Instant: Instan
最佳实践

编码算法

要学习编码算法,我们先来看一看什么是编码。 ASCII码就是一种编码,字母A的编码是十六进制的0x41,字母B是0x42,以此类推: 字母 ASCII编码 A 0x41 B 0x42 C 0x43 D 0x44 … … 因为ASCII编码最多只能有128个字符,要想对更多的文字进行编码,就需要用Unicode。而中文的中使用Unicode编码就是0x4e2d,使用UTF-8则需要3个字节编码: 汉
编码算法

哈希算法

哈希算法(Hash)又称摘要算法(Digest),它的作用是:对任意一组输入数据进行计算,得到一个固定长度的输出摘要。 哈希算法最重要的特点就是: 相同的输入一定得到相同的输出; 不同的输入大概率得到不同的输出。 哈希算法的目的就是为了验证原始数据是否被篡改。 Java字符串的hashCode()就是一个哈希算法,它的输入是任意字符串,输出是固定的4字节int整数: "hello".hashCod
哈希算法

BouncyCastle

我们知道,Java标准库提供了一系列常用的哈希算法。 但如果我们要用的某种算法,Java标准库没有提供怎么办? 方法一:自己写一个,难度很大; 方法二:找一个现成的第三方库,直接使用。 BouncyCastle就是一个提供了很多哈希算法和加密算法的第三方库。它提供了Java标准库没有的一些算法,例如,RipeMD160哈希算法。 我们来看一下如何使用BouncyCastle这个第三方提供的算法。
BouncyCastle

Hmac算法

在前面讲到哈希算法时,我们说,存储用户的哈希口令时,要加盐存储,目的就在于抵御彩虹表攻击。 我们回顾一下哈希算法: digest = hash(input) 正是因为相同的输入会产生相同的输出,我们加盐的目的就在于,使得输入有所变化: digest = hash(salt + input) 这个salt可以看作是一个额外的“认证码”,同样的输入,不同的认证码,会产生不同的输出。因此,要验证输出的哈
Hmac算法

对称加密算法

对称加密算法就是传统的用一个密码进行加密和解密。例如,我们常用的WinZIP和WinRAR对压缩包的加密和解密,就是使用对称加密算法: 从程序的角度看,所谓加密,就是这样一个函数,它接收密码和明文,然后输出密文: secret = encrypt(key, message); 而解密则相反,它接收密码和密文,然后输出明文: plain = decrypt(key, secret); 在软件开发中,
对称加密算法