KotlinCS 124 LogoJava
PrevIndexNext
Kotlin
Java
  • Implementing a Map : 04/26/2024

  • map-reduce-filter : 04/25/2024

  • Generics : 04/24/2024

  • Hashing : 04/23/2024

  • Binary Search : 04/22/2024

  • MP3: Course Ratings : 04/19/2024

  • Quicksort : 04/18/2024

  • Merge Sort : 04/17/2024

  • Sorting Algorithms : 04/16/2024

  • MP Debugging Part 1 : 04/15/2024

  • MP2: Course Activity : 04/12/2024

  • Practice with Recursion : 04/11/2024

  • MP Debugging Part 0 : 04/10/2024

  • MP2: API Client : 04/09/2024

  • MP2: API Server : 04/08/2024

  • Trees and Recursion : 04/05/2024

  • Trees : 04/04/2024

  • Recursion : 04/03/2024

  • MP1: Filtering and Search : 04/02/2024

  • MP1: Loading and Sorting : 04/01/2024

  • Lists Review and Performance : 03/29/2024

  • Linked Lists : 03/28/2024

  • Algorithms and Lists : 03/27/2024

  • Continuing MP0 : 03/26/2024

  • Getting Started with MP0 : 03/25/2024

  • Lambda Expressions : 03/22/2024

  • Anonymous Classes : 03/21/2024

  • Practice with Interfaces : 03/20/2024

  • Implementing Interfaces : 03/19/2024

  • Using Interfaces : 03/18/2024

  • Working with Exceptions : 03/08/2024

  • Throwing Exceptions : 03/07/2024

  • Catching Exceptions : 03/06/2024

  • References and Polymorphism : 03/05/2024

  • References : 03/04/2024

  • Data Modeling 2 : 03/01/2024

  • Equality and Object Copying : 02/29/2024

  • Polymorphism : 02/28/2024

  • Inheritance : 02/27/2024

  • Data Modeling 1 : 02/26/2024

  • Companion Objects : 02/23/2024

  • Encapsulation : 02/22/2024

  • Constructors : 02/21/2024

  • Objects, Continued : 02/20/2024

  • Introduction to Objects : 02/19/2024

  • Compilation and Immutability : 02/16/2024

  • Practice with Collections : 02/15/2024

  • Maps and Sets : 02/14/2024

  • Lists and Type Parameters : 02/13/2024

  • Imports and Libraries : 02/12/2024

  • Multidimensional Arrays : 02/09/2024

  • Practice with Strings : 02/08/2024

  • null : 02/07/2024

  • Algorithms and Strings : 02/06/2024

  • Strings : 02/05/2024

  • Functions and Algorithms : 02/02/2024

  • Practice with Functions : 02/01/2024

  • More About Functions : 01/31/2024

  • Errors and Debugging : 01/30/2024

  • Functions : 01/29/2024

  • Practice with Loops and Algorithms : 01/26/2024

  • Algorithms : 01/25/2024

  • Loops : 01/24/2024

  • Arrays : 01/23/2024

  • Compound Conditionals : 01/22/2024

  • Conditional Expressions and Statements : 01/19/2024

  • Operations on Variables : 01/18/2024

  • Variables and Types : 01/17/2024

  • Welcome to CS 124 : 01/16/2024

Hashing

println("you".hashCode())
println("you are not".hashCode())
println("you are not alone!".hashCode())

Welcome back! This lesson explores hashing, a mysterious and yet incredibly useful idea that is even included directly in our programming language!

This lesson covers some material that is both extremely cool and very useful for real-world programming. So let’s get started! Up first—the mysterious and useful power of hashing…

What is Hashing?
What is Hashing?

Wikipedia defines a hash function:

A hash function is any function that can be used to map data of arbitrary size to fixed-size values. The values returned by a hash function are called hash values, hash codes, digests, or simply hashes.

Let’s unpack that definition together…

Kotlin’s hashCode
Kotlin’s hashCode

Hashing turns out to be so useful that a hash function is one of the built-in methods that every Kotlin object provides. Let’s see how that works, and how to develop hash codes for our own classes:

// hashCode Examples

How Are Hashes Used?
How Are Hashes Used?

Are hash functions useful? Yes! Extremely! And, they are also very widely used! Let’s go through a few examples.

Download Verification
Download Verification

Hash functions are commonly used to verify downloaded files. Let’s see that in action.

Content Fingerprinting
Content Fingerprinting

Download verification is one example of an application of hash functions known as content fingerprinting. Let’s look at another: Git!

Proof of Work
Proof of Work

Hash functions also appear in another perhaps-unexpected place: Bitcoin mining! Let’s explore the fundamental concept of proof of work that is used to add blocks to the blockchain:

// Proof-of-Work Example

Practice: Course Hash Code

Created By: Geoffrey Challen
/ Version: 2020.10.0

Create a public class named Course providing a single constructor setting three private String? properties: department, number, and title, in that order. Implement hashCode using java.util.Objects by hashing the department and number, only, in that order.

Hash Collisions
Hash Collisions

If a hash function produces the same output for two different inputs, this is known as a collision. Whether or not a hash collision is a problem depends a lot on the application. But, it turns out that hash collisions are much more common than we might imagine! Let’s see why.

Practice: Restaurant Hash Code

Created By: Geoffrey Challen
/ Version: 2021.11.0

Create a public class named Restaurant providing a single primary constructor setting three private String properties: id, name, and cuisine, in that order. Implement hashCode using java.util.Objects by hashing the restaurant's id and name, only, in that order.

Homework: Location Hash Code

Created By: Geoffrey Challen
/ Version: 2022.9.0

Create a class named Location. Location should define a primary single constructor that accepts three fields: a String (the description), a Double (the latitude) and an Double (the longitude). You are welcome to name these fields however you like, and they should be private. Your constructor should reject invalid latitude and longitude values. Valid longitude values are between -180.0 and 180.0, inclusive, while valid latitude values are between -90.0 and 90.0, inclusive.

Implement hashCode using java.util.Objects by hashing the location's description, latitude, and longitude, in that order.

More Practice

Need more practice? Head over to the practice page.