Skip to main content

Interesting bug - Line endings and Hash Code


I recently came across an interesting bug which emphasize how different line endings format can break your custom equality implementation if you do not carefully consider them.

Context
We have an application that periodically updates the local assets with latest updated resources. In a nutshell, it makes an web api call to get the latest set of metadata and compare them against a locally stored metadata file. If they differs then we update the locally stored metadata file and download new/updated resources.

Bug
For a particular asset, associated metadata file was always getting updated although there were no visible changes detected using the revision history.

Investigation
My obvious suspect was the code responsible for doing the equality check between local metadata and the metadata received from the Web API.

For verification, I setup a conditional break-point which will be hit when the equality returns false. After my debug hit the break-point, I looked into all the properties and found that one of them was returning false. It was a list of tag objects and we were doing an HashSet equality comparison on that list. Something similar to below pseudo code:


Although, I had narrowed down the issue it was still not clear which object from the list was actually throwing the equality to false. So I decided to look into the hash-codes for this two list of objects.

Upon looking into the hash code, I discovered that one of the hash-code was different between the compared objects which happened to be at position 3. A quick lookup on the value at that position and viola!. One of them contains line endings as '\r\n' = CR + LF while the one from the web api contains '\n' = LF.

Most text editor will not display the different line endings in default view also line endings could be OS specific. Hence, it seems like nothing has been changed in the file. However, as they contains different values my custom equality implementation along with the get hash-code function generates different hashes for them and thus the equality returned false.

Here is a simplified version of the original class which implements IEquatable of T


Fix

Updating the object property getter to use consistent line ending. Basically doing a Regex replace with a '\r\n'.

After the above change is in place,  hash-code and hence the equality will be same for object with different line endings format. This will give us the expected result and our metadata file will not get unnecessarily updated.


Lesson Learned

Be mindful of different line endings, null values and sometimes different culture settings when implementing a custom equality based on string properties.


Comments

Popular posts from this blog

Creating dynamic email templates using C# and Office Outlook

It is quite common for many applications to send automated email notifications. Couple of months ago, I have worked on improving our old email template format to make it more user friendly.
In this tutorial I will walk you though regarding how I took advantage of Microsoft Outlook to quickly generate custom email template and later using the html template for building an automated custom email application using C#.

Steps:Creating Templates: Using the rich text editor support  in Outlook create a nicely formatted email. Use placeholder text for the values you like to change dynamically based on your task completion status.

To keep this tutorial simple, I have created a  simple table with placeholder text inside the third bracket [place holder text]. However, you can use anything supported by outlook editor.Getting HTML code: Send the created email to your own address. After that, open the sent email and right click to view source. It will display the HTML source of the email body with …

Trip to Drumheller

Book Review - The Phoenix Project

Here at Skybox Labs, we do regular lunch and learn session where a fellow colleague present on topics ranging from clean code, continuous integration, game development, machine learning to almost any areas where there are reasonable interests.

One of the very recent lunch and learn series that I have attended was focusing on DevOps which got me interested to learn more about the topic. I was looking for recommended books and the lead presenter highly recommended that I start with 'The Phoenix Project' by Gene Kim

Being inspired by the stellar reviews in Amazon, I have decided to get a copy and read it over the weekend.
A fantastic book that contains a wealth of information and delivers it in an intelligent and interesting way; a story. The book successfully captures the events and struggles of most people who work in IT Operations and gives a very good explanation on why these problems exist, and how you can solve them. It portrays a very effective way of thinking in applying …