Created
May 4, 2014 04:06
-
-
Save cuber/bcf0a3a96fc9a790d96d to your computer and use it in GitHub Desktop.
crc32 for postgresql
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Is this for little endian or big endian?