对于分片,我需要好的哈希算法。我需要为 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 位宽和正数,这是同样的事情。