Skip to content

Instantly share code, notes, and snippets.

@cuber
Created May 4, 2014 04:06
Show Gist options
  • Select an option

  • Save cuber/bcf0a3a96fc9a790d96d to your computer and use it in GitHub Desktop.

Select an option

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
Copy Markdown

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