2016-01-13 123 views
1

我发现这个MySQL函数Base58编码器在Github Gist中。PostgreSQL中的Base58编码器函数

DELIMITER $$ 

CREATE FUNCTION base58_encode (num int) RETURNS varchar(255) 
    DETERMINISTIC 

BEGIN 
    DECLARE alphabet varchar(255); 
    DECLARE base_count int DEFAULT 0; 
    DECLARE encoded varchar(255); 
    DECLARE divisor DECIMAL(10,4); 
    DECLARE mode int DEFAULT 0; 

    SET alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'; 
    SET base_count = CHAR_LENGTH(alphabet); 
    SET encoded = ""; 

    WHILE num >= base_count DO 
    SET divisor = num/base_count; 
    SET mode = (num - (base_count* TRUNCATE(divisor,0))); 
    SET encoded = CONCAT(SUBSTRING(alphabet FROM mode+1 FOR 1), encoded); 
    SET num = TRUNCATE(divisor,0); 
    END WHILE; 

    SET encoded = CONCAT(SUBSTRING(alphabet FROM num+1 FOR 1), encoded); 

    RETURN (encoded); 

END 

我是的新手,难以将上面的函数转换为PostgreSQL函数。

对于Base58编码器,上面的SQL代码段的等效PostgreSQL函数将如何工作?

+0

你有什么尝试,哪里有问题?因为这应该是易于阅读手册 –

+0

嗨@JuanCarlosOropeza,感谢提醒有关“手册”。发布PostgreSQL版本。 http://stackoverflow.com/a/34759277/1433665。谢谢! – TheKojuEffect

回答

1

我想出来的Pos​​tgreSQL中的等价函数如下。

CREATE FUNCTION base58_encode(num INT) 
    RETURNS VARCHAR(255) AS $encoded$ 

DECLARE 
    alphabet VARCHAR(255); 
    base_count INT DEFAULT 0; 
    encoded VARCHAR(255); 
    divisor DECIMAL(10, 4); 
    mod  INT DEFAULT 0; 

BEGIN 
    alphabet := '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'; 
    base_count := char_length(alphabet); 
    encoded := ''; 

    WHILE num >= base_count LOOP 
    divisor := num/base_count; 
    mod := (num - (base_count * trunc(divisor, 0))); 
    encoded := concat(substring(alphabet FROM mod + 1 FOR 1), encoded); 
    num := trunc(divisor, 0); 
    END LOOP; 

    encoded = concat(substring(alphabet FROM num + 1 FOR 1), encoded); 

    RETURN (encoded); 

END; $encoded$ 
LANGUAGE PLPGSQL;