シャーディングには、優れたハッシュ アルゴリズムが必要です。0-2^31 の範囲内で文字列のハッシュ整数値を生成する必要があります。これは可能ですか?
次の回答は、md5 アルゴリズムから整数を生成する方法を提供します。
しかし、範囲内でこの値を生成する方法はありますか?
シャーディングには、優れたハッシュ アルゴリズムが必要です。0-2^31 の範囲内で文字列のハッシュ整数値を生成する必要があります。これは可能ですか?
次の回答は、md5 アルゴリズムから整数を生成する方法を提供します。
しかし、範囲内でこの値を生成する方法はありますか?
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 ビット幅で正になります。これは同じことです。