Re: Adding unsigned 256 bit integers
От | Olivier Lalonde |
---|---|
Тема | Re: Adding unsigned 256 bit integers |
Дата | |
Msg-id | CALwxDuFEYULRr0LVUcutGN+2M4jB2ZeM-w9_WXcYkNo-6GXu9w@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: Adding unsigned 256 bit integers (Leon Smith <leon.p.smith@gmail.com>) |
Список | pgsql-hackers |
Thanks for helping me out everyone. I ended up simply using the numeric type (I didn't realize it could support such large numbers) and writing the hex-to-numeric conversion functions in my application code.
On 11 April 2014 12:27, Leon Smith <leon.p.smith@gmail.com> wrote:
pgmp is also worth mentioning here, and it's likely to be more efficient than the numeric type or something you hack up yourself:
http://pgmp.projects.pgfoundry.org/
Best,
LeonHi Olivier,On Thu, Apr 10, 2014 at 09:13:47PM +0800, Olivier Lalonde wrote:
> I was wondering if there would be any way to do the following in PostgreSQL:
>
> UPDATE cryptotable SET work = work + 'some big hexadecimal number'
>
> where work is an unsigned 256 bit integer. Right now my column is a
> character varying(64) column (hexadecimal representation of the number) but
> I would be happy to switch to another data type if it lets me do the
> operation above.
>
> If it's not possible with vanilla PostgreSQL, are there extensions that
> could help me?
>
> --
> - Oli
>
> Olivier Lalonde
> http://www.syskall.com <-- connect with me!
>
Here are some sample pl/pgsql helper functions that I have written for
other purposes. They use integers but can be adapted to use numeric.
Regards,
Ken
---------------------------
CREATE OR REPLACE FUNCTION hex2dec(t text) RETURNS integer AS $$
DECLARE
r RECORD;
BEGIN
FOR r IN EXECUTE 'SELECT x'''||t||'''::integer AS hex' LOOP
RETURN r.hex;
END LOOP;
END
$$ LANGUAGE plpgsql IMMUTABLE STRICT;
---------------------------
---------------------------
CREATE OR REPLACE FUNCTION bytea2int (
in_string BYTEA
) RETURNS INTEGER AS $$
DECLARE
b1 INTEGER := 0;
b2 INTEGER := 0;
b3 INTEGER := 0;
b4 INTEGER := 0;
out_int INTEGER := 0;
BEGIN
CASE OCTET_LENGTH(in_string)
WHEN 1 THEN
b4 := get_byte(in_string, 0);
WHEN 2 THEN
b3 := get_byte(in_string, 0);
b4 := get_byte(in_string, 1);
WHEN 3 THEN
b2 := get_byte(in_string, 0);
b3 := get_byte(in_string, 1);
b4 := get_byte(in_string, 2);
WHEN 4 THEN
b1 := get_byte(in_string, 0);
b2 := get_byte(in_string, 1);
b3 := get_byte(in_string, 2);
b4 := get_byte(in_string, 3);
END CASE;
out_int := (b1 << 24) + (b2 << 16) + (b3 << 8) + b4;
RETURN(out_int);
END;
$$ LANGUAGE plpgsql IMMUTABLE;
---------------------------
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
- Oli
Olivier Lalonde
http://www.syskall.com <-- connect with me!
Freelance web and Node.js engineer
Skype: o-lalonde
В списке pgsql-hackers по дате отправления: