さまざまなユーザーが実行したいくつかのテスト結果のファイル指向データベースを作成しています。このために、データベース内のすべてのエントリに対して一意の ID を生成する必要があります。ID は次の要件を満たす必要があります。
- ID はかなり小さくする必要があります (最大 6 文字)
- すべてのテストケースとユーザーの組み合わせに対して、毎回同じIDを生成する必要があります
私が試したのは、シード値が 31 の単純な BKDR ハッシュ関数で、次のように ord() 関数を使用しました。
@chars = split(//,$hash_var);
$hash = 0;
$seed = 31;
foreach $char ( @chars ) {
if( $char !~ m/\d/ ) {
$hash = ( $seed * $hash ) + ord( $char );
}
else {
$hash = ( $seed * $hash ) + $char ;
}
}
$hash = ( $hash & 0x7FFFFFFF ) % 1000;
$hash = "$chars[0]$chars[$#chars]$hash" ;
これにより、さまざまな組み合わせで同じ結果が得られることがあります。つまり、一意性が観察されません。これを達成する他の方法はありますか?シード値を変更すると、一意性を達成するのに役立ちますか?