0

シャーディングには、優れたハッシュ アルゴリズムが必要です。0-2^31 の範囲内で文字列のハッシュ整数値を生成する必要があります。これは可能ですか?

次の回答は、md5 アルゴリズムから整数を生成する方法を提供します。

PostgresSQL で文字列を数値にハッシュする

しかし、範囲内でこの値を生成する方法はありますか?

4

1 に答える 1

1

Hashing a String to a Numeric Value in PostgresSQLで提案されている関数では、32 ビットの範囲がbit(N)キャストの幅として表現されています。

型修飾子は定数でなければならないため、パラメーターとして渡すことはできませんが、固定の 31 ビットを取得するには、次のように関数を調整するだけです。

CREATE FUNCTION hash_string_into_31_bits(text) RETURNS int AS $$
   select ('x'||substr(md5($1),1,8))::bit(31)::int;
$$ language sql;

その場合、結果は常に 31 ビット幅で正になります。これは同じことです。

于 2014-11-12T12:37:44.053 に答える