Ben Nadel
On User Experience (UX) Design, JavaScript, ColdFusion, Node.js, Life, and Love.
Ben Nadel at the jQuery Conference 2011 (Cambridge, MA) with: Scott Fitchet
Ben Nadel at the jQuery Conference 2011 (Cambridge, MA) with: Scott Fitchet@figital )

Generating CRC-32 And Adler-32 Checksums In ColdFusion

By Ben Nadel on
Tags: ColdFusion

This morning, I was playing around with some code that required the calculation of a CRC-32 checksum. A checksum is a small volume of data that is calculated in an effort to detect corruption in a larger volume of data. While ColdFusion can easily hash any string or binary value as well as generate message authentication (MAC) codes, it doesn't have native support for the CRC-32 or Adler-32 checksum algorithms. But, Java does; and, ColdFusion is built on top of Java.

One of the most unsung - yet most brilliant - features of ColdFusion is that it is built on top of Java. This gives us access to a breathtaking amount of functionality right out of the box. Not to mention the ability to load community-provided JAR files. In this case, we're going to take advantage of the native java.util.zip package to implement the CRC-32 and Adler-32 checksum algorithms.

  • <cfscript>
  •  
  • /**
  • * I compute the Adler-32 checksum for the given string. (From the Java docs) An
  • * Adler-32 checksum is almost as reliable as a CRC-32 but can be computed much
  • * faster.
  • *
  • * @input I am the input being checked.
  • * @output false
  • */
  • public numeric function adler32( required string input ) {
  •  
  • var checksum = createObject( "java", "java.util.zip.Adler32" ).init();
  •  
  • checksum.update( charsetDecode( input, "utf-8" ) );
  •  
  • return( checksum.getValue() );
  •  
  • }
  •  
  •  
  • /**
  • * I compute the CRC-32 checksum for the given string.
  • *
  • * @input I am the input being checked.
  • * @output false
  • */
  • public numeric function crc32( required string input ) {
  •  
  • var checksum = createObject( "java", "java.util.zip.CRC32" ).init();
  •  
  • checksum.update( charsetDecode( input, "utf-8" ) );
  •  
  • return( checksum.getValue() );
  •  
  • }
  •  
  •  
  • // ------------------------------------------------------------------------------- //
  • // ------------------------------------------------------------------------------- //
  •  
  •  
  • // Let's test the CRC-32 and Adler-32 algorithms over a few different inputs.
  • inputs = [
  • "",
  • 123,
  • "ben@testing.com.edu",
  • "I'm a cybernetic organism. Living tissue over a metal endoskeleton.",
  • "In three years, Cyberdyne will become the largest supplier of military
  • computer systems. All stealth bombers are upgraded with Cyberdyne
  • computers, becoming fully unmanned. Afterwards, they fly with a
  • perfect operational record. The Skynet Funding Bill is passed. The
  • system goes online on August 4th, 1997. Human decisions are removed
  • from strategic defense. Skynet begins to learn at a geometric rate.
  • It becomes self-aware 2:14 AM, Eastern time, August 29th. In a panic,
  • they try to pull the plug."
  • ];
  •  
  • </cfscript>
  •  
  • <cfoutput>
  •  
  • <h2>
  • Using CRC-32
  • </h2>
  •  
  • <cfloop index="input" array="#inputs#">
  •  
  • <!--- Output twice to test repeatability. --->
  • #left( input, 30 )# ... #crc32( input )#<br />
  • #left( input, 30 )# ... #crc32( input )#<br />
  •  
  • </cfloop>
  •  
  •  
  • <h2>
  • Using Adler-32
  • </h2>
  •  
  • <cfloop index="input" array="#inputs#">
  •  
  • <!--- Output twice to test repeatability. --->
  • #left( input, 30 )# ... #adler32( input )#<br />
  • #left( input, 30 )# ... #adler32( input )#<br />
  •  
  • </cfloop>
  •  
  • </cfoutput>

Here, we're just using the same input array to generate CRC-32 and Adler-32 checksums. I'm checking each value twice to demonstrate that the checksum is consistent and repeatable. And, when we run the above code, we get the following output:

Using CRC-32

... 0
... 0
123 ... 2286445522
123 ... 2286445522
ben@testing.com.edu ... 1133179799
ben@testing.com.edu ... 1133179799
I'm a cybernetic organism. Liv ... 3386141641
I'm a cybernetic organism. Liv ... 3386141641
In three years, Cyberdyne will ... 1055043740
In three years, Cyberdyne will ... 1055043740

Using Adler-32

... 1
... 1
123 ... 19726487
123 ... 19726487
ben@testing.com.edu ... 1238107981
ben@testing.com.edu ... 1238107981
I'm a cybernetic organism. Liv ... 800790660
I'm a cybernetic organism. Liv ... 800790660
In three years, Cyberdyne will ... 79278972
In three years, Cyberdyne will ... 79278972

Honestly, I don't know all that much about checksums. But, from what I have read on Wikipedia, the Adler-32 checksum is faster to calculate than the CRC-32 checksum; but, the Adler-32 algorithm is less accurate and less effective on small inputs and inputs with common prefixes. Regardless, either algorithm can be easily leveraged in a ColdFusion application.




Reader Comments

Post A Comment

You — Get Out Of My Dreams, Get Into My Comments
Live in the Now
Oops!
Comment Etiquette: Please do not post spam. Please keep the comments on-topic. Please do not post unrelated questions or large chunks of code. And, above all, please be nice to each other - we're trying to have a good conversation here.