Skip to content

Instantly share code, notes, and snippets.

@cuber
Created May 4, 2014 04:06
Show Gist options
  • Save cuber/bcf0a3a96fc9a790d96d to your computer and use it in GitHub Desktop.
Save cuber/bcf0a3a96fc9a790d96d to your computer and use it in GitHub Desktop.
crc32 for postgresql
CREATE OR REPLACE FUNCTION CRC32(VARCHAR) RETURNS BIGINT AS
$BODY$
DECLARE
src alias FOR $1;
crc BIGINT not null default x'ffffffff'::BIGINT;
len INTEGER not null default 0;
i INTEGER not null DEFAULT 1;
table BIGINT[] not null DEFAULT ARRAY[
x'00000000'::BIGINT, x'77073096'::BIGINT, x'EE0E612C'::BIGINT, x'990951BA'::BIGINT,
x'076DC419'::BIGINT, x'706AF48F'::BIGINT, x'E963A535'::BIGINT, x'9E6495A3'::BIGINT,
x'0EDB8832'::BIGINT, x'79DCB8A4'::BIGINT, x'E0D5E91E'::BIGINT, x'97D2D988'::BIGINT,
x'09B64C2B'::BIGINT, x'7EB17CBD'::BIGINT, x'E7B82D07'::BIGINT, x'90BF1D91'::BIGINT,
x'1DB71064'::BIGINT, x'6AB020F2'::BIGINT, x'F3B97148'::BIGINT, x'84BE41DE'::BIGINT,
x'1ADAD47D'::BIGINT, x'6DDDE4EB'::BIGINT, x'F4D4B551'::BIGINT, x'83D385C7'::BIGINT,
x'136C9856'::BIGINT, x'646BA8C0'::BIGINT, x'FD62F97A'::BIGINT, x'8A65C9EC'::BIGINT,
x'14015C4F'::BIGINT, x'63066CD9'::BIGINT, x'FA0F3D63'::BIGINT, x'8D080DF5'::BIGINT,
x'3B6E20C8'::BIGINT, x'4C69105E'::BIGINT, x'D56041E4'::BIGINT, x'A2677172'::BIGINT,
x'3C03E4D1'::BIGINT, x'4B04D447'::BIGINT, x'D20D85FD'::BIGINT, x'A50AB56B'::BIGINT,
x'35B5A8FA'::BIGINT, x'42B2986C'::BIGINT, x'DBBBC9D6'::BIGINT, x'ACBCF940'::BIGINT,
x'32D86CE3'::BIGINT, x'45DF5C75'::BIGINT, x'DCD60DCF'::BIGINT, x'ABD13D59'::BIGINT,
x'26D930AC'::BIGINT, x'51DE003A'::BIGINT, x'C8D75180'::BIGINT, x'BFD06116'::BIGINT,
x'21B4F4B5'::BIGINT, x'56B3C423'::BIGINT, x'CFBA9599'::BIGINT, x'B8BDA50F'::BIGINT,
x'2802B89E'::BIGINT, x'5F058808'::BIGINT, x'C60CD9B2'::BIGINT, x'B10BE924'::BIGINT,
x'2F6F7C87'::BIGINT, x'58684C11'::BIGINT, x'C1611DAB'::BIGINT, x'B6662D3D'::BIGINT,
x'76DC4190'::BIGINT, x'01DB7106'::BIGINT, x'98D220BC'::BIGINT, x'EFD5102A'::BIGINT,
x'71B18589'::BIGINT, x'06B6B51F'::BIGINT, x'9FBFE4A5'::BIGINT, x'E8B8D433'::BIGINT,
x'7807C9A2'::BIGINT, x'0F00F934'::BIGINT, x'9609A88E'::BIGINT, x'E10E9818'::BIGINT,
x'7F6A0DBB'::BIGINT, x'086D3D2D'::BIGINT, x'91646C97'::BIGINT, x'E6635C01'::BIGINT,
x'6B6B51F4'::BIGINT, x'1C6C6162'::BIGINT, x'856530D8'::BIGINT, x'F262004E'::BIGINT,
x'6C0695ED'::BIGINT, x'1B01A57B'::BIGINT, x'8208F4C1'::BIGINT, x'F50FC457'::BIGINT,
x'65B0D9C6'::BIGINT, x'12B7E950'::BIGINT, x'8BBEB8EA'::BIGINT, x'FCB9887C'::BIGINT,
x'62DD1DDF'::BIGINT, x'15DA2D49'::BIGINT, x'8CD37CF3'::BIGINT, x'FBD44C65'::BIGINT,
x'4DB26158'::BIGINT, x'3AB551CE'::BIGINT, x'A3BC0074'::BIGINT, x'D4BB30E2'::BIGINT,
x'4ADFA541'::BIGINT, x'3DD895D7'::BIGINT, x'A4D1C46D'::BIGINT, x'D3D6F4FB'::BIGINT,
x'4369E96A'::BIGINT, x'346ED9FC'::BIGINT, x'AD678846'::BIGINT, x'DA60B8D0'::BIGINT,
x'44042D73'::BIGINT, x'33031DE5'::BIGINT, x'AA0A4C5F'::BIGINT, x'DD0D7CC9'::BIGINT,
x'5005713C'::BIGINT, x'270241AA'::BIGINT, x'BE0B1010'::BIGINT, x'C90C2086'::BIGINT,
x'5768B525'::BIGINT, x'206F85B3'::BIGINT, x'B966D409'::BIGINT, x'CE61E49F'::BIGINT,
x'5EDEF90E'::BIGINT, x'29D9C998'::BIGINT, x'B0D09822'::BIGINT, x'C7D7A8B4'::BIGINT,
x'59B33D17'::BIGINT, x'2EB40D81'::BIGINT, x'B7BD5C3B'::BIGINT, x'C0BA6CAD'::BIGINT,
x'EDB88320'::BIGINT, x'9ABFB3B6'::BIGINT, x'03B6E20C'::BIGINT, x'74B1D29A'::BIGINT,
x'EAD54739'::BIGINT, x'9DD277AF'::BIGINT, x'04DB2615'::BIGINT, x'73DC1683'::BIGINT,
x'E3630B12'::BIGINT, x'94643B84'::BIGINT, x'0D6D6A3E'::BIGINT, x'7A6A5AA8'::BIGINT,
x'E40ECF0B'::BIGINT, x'9309FF9D'::BIGINT, x'0A00AE27'::BIGINT, x'7D079EB1'::BIGINT,
x'F00F9344'::BIGINT, x'8708A3D2'::BIGINT, x'1E01F268'::BIGINT, x'6906C2FE'::BIGINT,
x'F762575D'::BIGINT, x'806567CB'::BIGINT, x'196C3671'::BIGINT, x'6E6B06E7'::BIGINT,
x'FED41B76'::BIGINT, x'89D32BE0'::BIGINT, x'10DA7A5A'::BIGINT, x'67DD4ACC'::BIGINT,
x'F9B9DF6F'::BIGINT, x'8EBEEFF9'::BIGINT, x'17B7BE43'::BIGINT, x'60B08ED5'::BIGINT,
x'D6D6A3E8'::BIGINT, x'A1D1937E'::BIGINT, x'38D8C2C4'::BIGINT, x'4FDFF252'::BIGINT,
x'D1BB67F1'::BIGINT, x'A6BC5767'::BIGINT, x'3FB506DD'::BIGINT, x'48B2364B'::BIGINT,
x'D80D2BDA'::BIGINT, x'AF0A1B4C'::BIGINT, x'36034AF6'::BIGINT, x'41047A60'::BIGINT,
x'DF60EFC3'::BIGINT, x'A867DF55'::BIGINT, x'316E8EEF'::BIGINT, x'4669BE79'::BIGINT,
x'CB61B38C'::BIGINT, x'BC66831A'::BIGINT, x'256FD2A0'::BIGINT, x'5268E236'::BIGINT,
x'CC0C7795'::BIGINT, x'BB0B4703'::BIGINT, x'220216B9'::BIGINT, x'5505262F'::BIGINT,
x'C5BA3BBE'::BIGINT, x'B2BD0B28'::BIGINT, x'2BB45A92'::BIGINT, x'5CB36A04'::BIGINT,
x'C2D7FFA7'::BIGINT, x'B5D0CF31'::BIGINT, x'2CD99E8B'::BIGINT, x'5BDEAE1D'::BIGINT,
x'9B64C2B0'::BIGINT, x'EC63F226'::BIGINT, x'756AA39C'::BIGINT, x'026D930A'::BIGINT,
x'9C0906A9'::BIGINT, x'EB0E363F'::BIGINT, x'72076785'::BIGINT, x'05005713'::BIGINT,
x'95BF4A82'::BIGINT, x'E2B87A14'::BIGINT, x'7BB12BAE'::BIGINT, x'0CB61B38'::BIGINT,
x'92D28E9B'::BIGINT, x'E5D5BE0D'::BIGINT, x'7CDCEFB7'::BIGINT, x'0BDBDF21'::BIGINT,
x'86D3D2D4'::BIGINT, x'F1D4E242'::BIGINT, x'68DDB3F8'::BIGINT, x'1FDA836E'::BIGINT,
x'81BE16CD'::BIGINT, x'F6B9265B'::BIGINT, x'6FB077E1'::BIGINT, x'18B74777'::BIGINT,
x'88085AE6'::BIGINT, x'FF0F6A70'::BIGINT, x'66063BCA'::BIGINT, x'11010B5C'::BIGINT,
x'8F659EFF'::BIGINT, x'F862AE69'::BIGINT, x'616BFFD3'::BIGINT, x'166CCF45'::BIGINT,
x'A00AE278'::BIGINT, x'D70DD2EE'::BIGINT, x'4E048354'::BIGINT, x'3903B3C2'::BIGINT,
x'A7672661'::BIGINT, x'D06016F7'::BIGINT, x'4969474D'::BIGINT, x'3E6E77DB'::BIGINT,
x'AED16A4A'::BIGINT, x'D9D65ADC'::BIGINT, x'40DF0B66'::BIGINT, x'37D83BF0'::BIGINT,
x'A9BCAE53'::BIGINT, x'DEBB9EC5'::BIGINT, x'47B2CF7F'::BIGINT, x'30B5FFE9'::BIGINT,
x'BDBDF21C'::BIGINT, x'CABAC28A'::BIGINT, x'53B39330'::BIGINT, x'24B4A3A6'::BIGINT,
x'BAD03605'::BIGINT, x'CDD70693'::BIGINT, x'54DE5729'::BIGINT, x'23D967BF'::BIGINT,
x'B3667A2E'::BIGINT, x'C4614AB8'::BIGINT, x'5D681B02'::BIGINT, x'2A6F2B94'::BIGINT,
x'B40BBE37'::BIGINT, x'C30C8EA1'::BIGINT, x'5A05DF1B'::BIGINT, x'2D02EF8D'::BIGINT
];
BEGIN
len := CHAR_LENGTH(src);
while i <= len loop
crc := (crc >> 8) # table[((crc & x'FF'::BIGINT) # ascii(substr(src, i , 1))) + 1];
i := i + 1;
END loop;
return crc # x'FFFFFFFF'::BIGINT;
END
$BODY$
LANGUAGE plpgsql;
@ray-ronnaret
Copy link

Is this for little endian or big endian?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment