CRC32 ( )

Function stats

Average user rating
260
363
9999
Support
FileMaker 10.0 +
Date posted
05 January 2014
Last updated
05 January 2014
Version
Recursive function
Yes

Author Info
 Jeremy Bante

10 functions

Average Rating 5.0

author_avatar



 

Function overview

Prototype

CRC32  ( asciiText )


Parameters

asciiText  A string a text with character codes between 0 and 255


Description

Tags:  hash   crc32   crc   checksum  

Returns a 32 bit cyclic redundancy check

Examples

Sample input

CRC32 ( "message digest" )


Sample output

538287487

 

Function code

/*******************************************************************************
* CRC32 ( asciiText )
* Computes a cyclic redundancy check (32 bit) for a string of text.
*
* @parameter asciiText: A string a text with character codes between 0 and 255.
*
* @return A number representing a 32-bit checksum
*
* @history 2014-01-05 - Jeremy Bante <http://scr.im/jbante> - Created
*
* @see http://en.wikipedia.org/wiki/Cyclic_redundancy_check
******************************************************************************/

Case (
    /* Step 0, set-up */
    not $~crc.step ;
        Let ( [
            // initialize checksum with 0xffffffffL (2^32 - 1)
            $~crc.crc = 4294967295 ;
            $~crc.i = 1 ;
            $~crc.byte = Code ( Middle ( asciiText ; $~crc.i ; 1 ) ) ;
            $~crc.step =
                Case (
                    IsEmpty ( $~crc.byte ) ; -1 ;
                    $~crc.byte > 255 ; -2 ;    // out of range
                    /* Else */ 1
                )
        ] ;
            CRC32 ( asciiText )
        ) ;

    /* Step 1, accumulate CRC */
    $~crc.step = 1 ;
        Let ( [
            // calculate CRC for $~crc.byte
            // ~tableIndex = ( crc ^ byte )
            ~bitPair1 =
                Mod ( Div ( $~crc.crc ; 64 ) ; 4 ) * 4
                + Mod ( Div ( $~crc.byte ; 64 ) ; 4 ) ;
            ~bitPair2 =
                Mod ( Div ( $~crc.crc ; 16 ) ; 4 ) * 4
                + Mod ( Div ( $~crc.byte ; 16 ) ; 4 ) ;
            ~bitPair3 =
                Mod ( Div ( $~crc.crc ; 4 ) ; 4 ) * 4
                + Mod ( Div ( $~crc.byte ; 4 ) ; 4 ) ;
            ~bitPair4 =
                Mod ( $~crc.crc ; 4 ) * 4
                + Mod ( $~crc.byte ; 4 ) ;
            ~tableIndex =
                64 * Choose ( ~bitPair1 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                )
                + 16 * Choose ( ~bitPair2 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                )
                + 4 * Choose ( ~bitPair3 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                )
                + Choose ( ~bitPair4 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                ) ;
            ~tableValue =
                Choose ( ~tableIndex ;
                    0 ; 1996959894 ; 3993919788 ; 2567524794 ;
                    124634137 ; 1886057615 ; 3915621685 ; 2657392035 ;
                    249268274 ; 2044508324 ; 3772115230 ; 2547177864 ;
                    162941995 ; 2125561021 ; 3887607047 ; 2428444049 ;
                    498536548 ; 1789927666 ; 4089016648 ; 2227061214 ;
                    450548861 ; 1843258603 ; 4107580753 ; 2211677639 ;
                    325883990 ; 1684777152 ; 4251122042 ; 2321926636 ;
                    335633487 ; 1661365465 ; 4195302755 ; 2366115317 ;
                    997073096 ; 1281953886 ; 3579855332 ; 2724688242 ;
                    1006888145 ; 1258607687 ; 3524101629 ; 2768942443 ;
                    901097722 ; 1119000684 ; 3686517206 ; 2898065728 ;
                    853044451 ; 1172266101 ; 3705015759 ; 2882616665 ;
                    651767980 ; 1373503546 ; 3369554304 ; 3218104598 ;
                    565507253 ; 1454621731 ; 3485111705 ; 3099436303 ;
                    671266974 ; 1594198024 ; 3322730930 ; 2970347812 ;
                    795835527 ; 1483230225 ; 3244367275 ; 3060149565 ;
                    1994146192 ; 31158534 ; 2563907772 ; 4023717930 ;
                    1907459465 ; 112637215 ; 2680153253 ; 3904427059 ;
                    2013776290 ; 251722036 ; 2517215374 ; 3775830040 ;
                    2137656763 ; 141376813 ; 2439277719 ; 3865271297 ;
                    1802195444 ; 476864866 ; 2238001368 ; 4066508878 ;
                    1812370925 ; 453092731 ; 2181625025 ; 4111451223 ;
                    1706088902 ; 314042704 ; 2344532202 ; 4240017532 ;
                    1658658271 ; 366619977 ; 2362670323 ; 4224994405 ;
                    1303535960 ; 984961486 ; 2747007092 ; 3569037538 ;
                    1256170817 ; 1037604311 ; 2765210733 ; 3554079995 ;
                    1131014506 ; 879679996 ; 2909243462 ; 3663771856 ;
                    1141124467 ; 855842277 ; 2852801631 ; 3708648649 ;
                    1342533948 ; 654459306 ; 3188396048 ; 3373015174 ;
                    1466479909 ; 544179635 ; 3110523913 ; 3462522015 ;
                    1591671054 ; 702138776 ; 2966460450 ; 3352799412 ;
                    1504918807 ; 783551873 ; 3082640443 ; 3233442989 ;
                    3988292384 ; 2596254646 ; 62317068 ; 1957810842 ;
                    3939845945 ; 2647816111 ; 81470997 ; 1943803523 ;
                    3814918930 ; 2489596804 ; 225274430 ; 2053790376 ;
                    3826175755 ; 2466906013 ; 167816743 ; 2097651377 ;
                    4027552580 ; 2265490386 ; 503444072 ; 1762050814 ;
                    4150417245 ; 2154129355 ; 426522225 ; 1852507879 ;
                    4275313526 ; 2312317920 ; 282753626 ; 1742555852 ;
                    4189708143 ; 2394877945 ; 397917763 ; 1622183637 ;
                    3604390888 ; 2714866558 ; 953729732 ; 1340076626 ;
                    3518719985 ; 2797360999 ; 1068828381 ; 1219638859 ;
                    3624741850 ; 2936675148 ; 906185462 ; 1090812512 ;
                    3747672003 ; 2825379669 ; 829329135 ; 1181335161 ;
                    3412177804 ; 3160834842 ; 628085408 ; 1382605366 ;
                    3423369109 ; 3138078467 ; 570562233 ; 1426400815 ;
                    3317316542 ; 2998733608 ; 733239954 ; 1555261956 ;
                    3268935591 ; 3050360625 ; 752459403 ; 1541320221 ;
                    2607071920 ; 3965973030 ; 1969922972 ; 40735498 ;
                    2617837225 ; 3943577151 ; 1913087877 ; 83908371 ;
                    2512341634 ; 3803740692 ; 2075208622 ; 213261112 ;
                    2463272603 ; 3855990285 ; 2094854071 ; 198958881 ;
                    2262029012 ; 4057260610 ; 1759359992 ; 534414190 ;
                    2176718541 ; 4139329115 ; 1873836001 ; 414664567 ;
                    2282248934 ; 4279200368 ; 1711684554 ; 285281116 ;
                    2405801727 ; 4167216745 ; 1634467795 ; 376229701 ;
                    2685067896 ; 3608007406 ; 1308918612 ; 956543938 ;
                    2808555105 ; 3495958263 ; 1231636301 ; 1047427035 ;
                    2932959818 ; 3654703836 ; 1088359270 ; 936918000 ;
                    2847714899 ; 3736837829 ; 1202900863 ; 817233897 ;
                    3183342108 ; 3401237130 ; 1404277552 ; 615818150 ;
                    3134207493 ; 3453421203 ; 1423857449 ; 601450431 ;
                    3009837614 ; 3294710456 ; 1567103746 ; 711928724 ;
                    3020668471 ; 3272380065 ; 1510334235 ; 755167117
                ) ;
            $~crc.crc = Div ( $~crc.crc ; 256 ) ;    // right bitshift 8

            // crc = tableValue ^ crc (32 bit)
            ~bitPair1 =
                Mod ( Div ( ~tableValue ; 1073741824 ) ; 4 ) * 4
                + Mod ( Div ( $~crc.crc ; 1073741824 ) ; 4 ) ;
            ~bitPair2 =
                Mod ( Div ( ~tableValue ; 268435456 ) ; 4 ) * 4
                + Mod ( Div ( $~crc.crc ; 268435456 ) ; 4 ) ;
            ~bitPair3 =
                Mod ( Div ( ~tableValue ; 67108864 ) ; 4 ) * 4
                + Mod ( Div ( $~crc.crc ; 67108864 ) ; 4 ) ;
            ~bitPair4 =
                Mod ( Div ( ~tableValue ; 16777216 ) ; 4 ) * 4
                + Mod ( Div ( $~crc.crc ; 16777216 ) ; 4 ) ;
            ~bitPair5 =
                Mod ( Div ( ~tableValue ; 4194304 ) ; 4 ) * 4
                + Mod ( Div ( $~crc.crc ; 4194304 ) ; 4 ) ;
            ~bitPair6 =
                Mod ( Div ( ~tableValue ; 1048576 ) ; 4 ) * 4
                + Mod ( Div ( $~crc.crc ; 1048576 ) ; 4 ) ;
            ~bitPair7 =
                Mod ( Div ( ~tableValue ; 262144 ) ; 4 ) * 4
                + Mod ( Div ( $~crc.crc ; 262144 ) ; 4 ) ;
            ~bitPair8 =
                Mod ( Div ( ~tableValue ; 65536 ) ; 4 ) * 4
                + Mod ( Div ( $~crc.crc ; 65536 ) ; 4 ) ;
            ~bitPair9 =
                Mod ( Div ( ~tableValue ; 16384 ) ; 4 ) * 4
                + Mod ( Div ( $~crc.crc ; 16384 ) ; 4 ) ;
            ~bitPair10 =
                Mod ( Div ( ~tableValue ; 4096 ) ; 4 ) * 4
                + Mod ( Div ( $~crc.crc ; 4096 ) ; 4 ) ;
            ~bitPair11 =
                Mod ( Div ( ~tableValue ; 1024 ) ; 4 ) * 4
                + Mod ( Div ( $~crc.crc ; 1024 ) ; 4 ) ;
            ~bitPair12 =
                Mod ( Div ( ~tableValue ; 256 ) ; 4 ) * 4
                + Mod ( Div ( $~crc.crc ; 256 ) ; 4 ) ;
            ~bitPair13 =
                Mod ( Div ( ~tableValue ; 64 ) ; 4 ) * 4
                + Mod ( Div ( $~crc.crc ; 64 ) ; 4 ) ;
            ~bitPair14 =
                Mod ( Div ( ~tableValue ; 16 ) ; 4 ) * 4
                + Mod ( Div ( $~crc.crc ; 16 ) ; 4 ) ;
            ~bitPair15 =
                Mod ( Div ( ~tableValue ; 4 ) ; 4 ) * 4
                + Mod ( Div ( $~crc.crc ; 4 ) ; 4 ) ;
            ~bitPair16 = Mod ( ~tableValue ; 4 ) * 4 + Mod ( $~crc.crc ; 4 ) ;
            $~crc.crc =    // ~tableValue ^ $~crc.crc
                1073741824 * Choose ( ~bitPair1 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                )
                + 268435456 * Choose ( ~bitPair2 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                )
                + 67108864 * Choose ( ~bitPair3 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                )
                + 16777216 * Choose ( ~bitPair4 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                )
                + 4194304 * Choose ( ~bitPair5 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                )
                + 1048576 * Choose ( ~bitPair6 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                )
                + 262144 * Choose ( ~bitPair7 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                )
                + 65536 * Choose ( ~bitPair8 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                )
                + 16384 * Choose ( ~bitPair9 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                )
                + 4096 * Choose ( ~bitPair10 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                )
                + 1024 * Choose ( ~bitPair11 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                )
                + 256 * Choose ( ~bitPair12 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                )
                + 64 * Choose ( ~bitPair13 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                )
                + 16 * Choose ( ~bitPair14 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                )
                + 4 * Choose ( ~bitPair16 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                )
                + Choose ( ~bitPair16 ;
                    0 ; 1 ; 2 ; 3 ; 1 ; 0 ; 3 ; 2 ;
                    2 ; 3 ; 0 ; 1 ; 3 ; 2 ; 1 ; 0
                ) ;

            // setup next character
            $~crc.i = $~crc.i + 1 ;
            $~crc.byte = Code ( Middle ( asciiText ; $~crc.i ; 1 ) ) ;
            $~crc.step =
                Case (
                    IsEmpty ( $~crc.byte ) ; $~crc.step + 1 ;    // end
                    $~crc.byte > 255 ; -2 ;    // out of range
                    /* Else */ $~crc.step
                )
        ] ;
            CRC32 ( asciiText )
        ) ;

    /* Step 2, clean-up and return result */
    $~crc.step = 2 or $~crc.step < 0 ;
        Let ( [
            ~result =
                Case (
                    $~crc.step = -1 ;    // empty input
                        0 ;

                    $~crc.step = -2 ;
                        "ERROR: Character out of range ("
                        & $~crc.byte
                        & ")" ;

                    /* Else, take one's complement of result so far */
                        4294967296 - $~crc.crc - 1
                ) ;

            // purge variables
            $~crc.byte = "" ;
            $~crc.crc = "" ;
            $~crc.i = "" ;
            $~crc.step = ""
        ] ;
            ~result
        )
)

// ===================================
/*

    This function is published on FileMaker Custom Functions
    to check for updates and provide feedback and bug reports
    please visit http://www.fmfunctions.com/fid/363

    Prototype: CRC32( asciiText )
    Function Author: Jeremy Bante (http://www.fmfunctions.com/mid/260)
    Last updated: 05 January 2014
    Version: 1.1

*/
// ===================================

 

 

 

 

 

 

 

Top Tags

Text Parsing  (33)
List  (31)
Date  (28)
XML  (26)
Format  (23)
Sql  (22)
Dev  (20)
Debug  (17)
Interface  (15)
Layout  (15)
Text  (14)
Variables  (12)
Layout Objects  (11)
Filter  (11)
Design  (10)
Array  (7)