在Redshift中将MD5输出转换为32位整数

时间:2016-02-22 11:53:09

标签: postgresql amazon-redshift

我在Redshift中尝试了以下内容

SELECT STRTOL(MD5('345793260804895811'), 10);

但是我得到了以下DBCException

  

SQL错误[22023]:错误:输入cf82576a6dbf9ff63cf9828f990f0673无效转换为基数10

     

org.postgresql.util.PSQLException:PSQLException:错误:输入cf82576a6dbf9ff63cf9828f990f0673无效转换为基数10

我怎样才能在Redshift中完成这项工作?

4 个答案:

答案 0 :(得分:5)

你有两个问题:

  • 首先,您需要将转换指定为基础16
  • 其次,MD5字符串将大量溢出64位BIGINT

这很好用

SELECT STRTOL(LEFT(MD5('345793260804895811'),15), 16);

将MD5十六进制值缩短为最左边的15个字符,并使用基数16转换为BIGINT

答案 1 :(得分:4)

我提出将MD5存储在两个BIGINT字段而不是CHAR(32)中 - 节省2倍空间!

select 
    convert(bigint,
        strtol(substring(hash,1,8),16) * 4294967296.0 +
        strtol(substring(hash,9,8),16) - 9223372036854775807
    ) as hash_part1
    ,convert(bigint,
        strtol(substring(hash,17,8),16) * 4294967296.0 +
        strtol(substring(hash,25,8),16) - 9223372036854775807
    ) as hash_part2

希望它有所帮助。

答案 2 :(得分:0)

MD5的结果是128位长(ref),你不能把它装进32位整数。

答案 3 :(得分:0)

您可以尝试转换基数为16而不是10:

SELECT STRTOL(MD5('cf82576a6dbf9ff63cf9828f990f0673'), 16);