在测试PostgreSQL's md5()
function时,我注意到了非常奇怪的行为:
按预期工作
SELECT md5('abc')
--"900150983cd24fb0d6963f7d28e17f72"
但在查询中使用md5()函数:
SELECT request_id, md5(request_id)
FROM Request
ORDER BY request_id
导致此错误:
ERROR: function md5(integer) does not exist
LINE 1: SELECT request_id, md5(request_id)
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
********** Error **********
ERROR: function md5(integer) does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Character: 20
如果在第一个查询中有效, 函数如何存在? 我做错了什么;在SELECT查询中使用md5()
的正确方法是什么?
答案 0 :(得分:11)
该函数需要text作为参数。施展它:
SELECT request_id, md5(request_id::text)
FROM Request
ORDER BY request_id
名为md5的函数接受整数参数不存在,但您可以创建它:
create function md5(integer)
returns text as $$
select md5($1::text);
$$ language sql immutable;
然后md5会有3个签名:
=> \df md5
List of functions
Schema | Name | Result data type | Argument data types | Type
------------+------+------------------+---------------------+--------
pg_catalog | md5 | text | bytea | normal
pg_catalog | md5 | text | text | normal
public | md5 | text | integer | normal
正如对此答案的评论中所指出的,整数文本表示的md5哈希可能不是您想要的。要使用二进制的哈希,应使用接受bytea
参数的md5签名:
select md5(('\x' || right('0000000' || to_hex(200), 8))::bytea);
md5
----------------------------------
b7b436d004c1cc0501bee9e296d2eaa4
并替换以前创建的函数:
create or replace function md5(integer)
returns text as $$
select md5(('\x' || right('0000000' || to_hex($1), 8))::bytea);
$$ language sql immutable;
答案 1 :(得分:3)
一般来说,取整数的md5没有多大意义。您似乎可能试图模糊序列,使其按顺序显示为半随机。如果是这样,那就有更好的方法:
使用pseudo_encrypt
function listed on the PostgreSQL wiki。比试图获取整数的md5然后(可能)截断它更安全。
以上不提供强大的加密随机性,但您的方法也不是。如果您出于安全原因需要您的请求ID真正无法预测,而不是随便一目了然,您应该使用强大的加密随机数生成器,并准备好使用时间窗等处理重复项。
答案 2 :(得分:0)
错误有点误导;存在md5()
函数,而不是处理整数。使用嵌入式CAST()
函数将整数字段转换为文本,它将起作用:
SELECT request_id, md5(CAST(request_id AS TEXT))
FROM Request
ORDER BY request_id
--1;"c4ca4238a0b923820dcc509a6f75849b"
--2;"c81e728d9d4c2f636f067f89cc14862c"
--etc
答案 3 :(得分:0)
我只想尝试生成一个非显而易见的非重复值 可以用来查找记录。
你需要的是一个双射哈希。我在自定义C函数中使用CRC
CPU函数。对于没有该功能的CPU,可以使用查找表。
这种方法可以保证为您提供独特的随机观看效果。每个唯一的32位输入的数字。
如果您知道如何生成C函数(非常简单),那么查找如何使用CRC将是一项简单的任务。