我在Github Gist中找到了Base58编码器的MySQL函数。
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
的新手,很难将上面的函数转换为PostgreSQL函数。
对于Base58 Encoder来说,上面的SQL代码段的等效PostgreSQL
函数是什么?
6条答案
按热度按时间pnwntuvh1#
我在PostgreSQL中提出的等效函数如下。
kr98yfug2#
为了完整起见,这里有一个快速而肮脏的逆
base58_decode()
函数:lfapxunr3#
Postgres 9.x
j13ufse24#
为了继续完整性,如果您需要解码为UUID(Int 16),我在@mike-blackwell的答案上构建了它。Gist
我喜欢一些反馈和改进。我不得不想象有一种更好的方法可以将128位数字转换为UUID
验证码:
holgip5t5#
我已经修改了上面的Postgres 9.x的示例。事实证明,它可以处理大量数据(例如区块链地址)
6tqwzwtp6#
下面是一个将uuid转换为base58的函数。由于postgres通常不能处理UUID的BigInt转换,因此您可以使用扩展将JS直接放入postgres中:
适合短ID,您可以来回转换: