いくつかのハッシュ関数を含むライブラリを作成しています。
関数の 1 つがハッシュ (byte[]) と、ハッシュで使用するために生成されたランダム ソルト (byte[]) を返すようにします。これを行う最もユーザーフレンドリーで直感的な方法は何でしょうか?
ハッシュを返し、ソルトを out パラメータとして返すことで動作するこれの C# バージョンがあります。これは完全に機能しますが、Java は out パラメータの贅沢を与えてくれません。
何かご意見は?
いくつかのハッシュ関数を含むライブラリを作成しています。
関数の 1 つがハッシュ (byte[]) と、ハッシュで使用するために生成されたランダム ソルト (byte[]) を返すようにします。これを行う最もユーザーフレンドリーで直感的な方法は何でしょうか?
ハッシュを返し、ソルトを out パラメータとして返すことで動作するこれの C# バージョンがあります。これは完全に機能しますが、Java は out パラメータの贅沢を与えてくれません。
何かご意見は?
もちろん、最も洗練された方法は、ハッシュとソルトをクラスにカプセル化し、このクラスのインスタンスを返すことです。
class HashAndSalt {
private byte[] hash, salt;
public HashAndSalt(byte[] hash, byte[] salt) {
this.hash = hash;
this.salt = salt;
}
// access methods goes here
}
上記のアプローチを選択する主な理由は、変数に何が含まれているかがクライアント側で明確になるためです。I for oneのようなものを返すとbyte[2][]
、ハッシュがインデックス 0 にあるか 1 にあるかを忘れ続けます。
フィールドを final にすると、それらを public にして access-method をスキップできると主張する人もいるでしょう。
Project Lombok を使用している場合は、@Data
注釈を使用して、ハッシュ + ソルトをカプセル化する値クラスを作成できます。Lombok-ifier はボイラープレート コードを自動的に生成します。
変数を使用final
して不変のクラスを作成すれば、悲しみから解放されます。
これを行う簡単な方法は、構造体にハッシュとソルトを含む小さな構造体です。
hash byte[] と salt byte[] を 2 つのインスタンス変数として持つオブジェクトを作成する必要があります。
何かのようなもの:
public class HashParams {
public byte hash[];
public byte salt[];
}