Skip to main content
Ben Nadel
On User Experience (UX) Design, JavaScript, ColdFusion, Node.js, Life, and Love.

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