我正在编写一个包含一些哈希函数的库。
我希望其中一个函数返回散列(byte[])和生成用于散列的随机盐(byte[])。最用户友好、最直观的方式是什么?
我有一个 C# 版本,它通过返回散列然后将盐作为输出参数传回,效果很好,但是 Java 并没有给我输出参数的奢侈。
有什么想法吗?
我正在编写一个包含一些哈希函数的库。
我希望其中一个函数返回散列(byte[])和生成用于散列的随机盐(byte[])。最用户友好、最直观的方式是什么?
我有一个 C# 版本,它通过返回散列然后将盐作为输出参数传回,效果很好,但是 Java 并没有给我输出参数的奢侈。
有什么想法吗?
最优雅的方式当然是将 hash 和 salt 封装在一个类中,并返回这个类的一个实例。
class HashAndSalt {
private byte[] hash, salt;
public HashAndSalt(byte[] hash, byte[] salt) {
this.hash = hash;
this.salt = salt;
}
// access methods goes here
}
选择上述方法的主要原因是客户端很清楚变量包含什么。如果您返回类似byte[2][]
I for one 的内容,则会一直忘记哈希是在索引 0 还是 1 中。
如果您将字段设置为最终字段,有些人甚至可能会争辩说您可以将它们公开并跳过访问方法。
如果您使用的是 Lombok 项目,您可以使用@Data
注解创建一个封装了 hash + salt 的值类,Lombok-ifier 会自动生成样板代码。
使用final
变量来创建一个不可变的类,你会省去烦恼。
一种直接的方法是在结构中包含哈希和盐的小结构。
您必须创建一个 Object,其中包含 hash byte[] 和 salt byte[] 作为两个实例变量。
就像是:
public class HashParams {
public byte hash[];
public byte salt[];
}