Skip to main content

GUID: Create Unique IDs for SQL Server & C#

GUID Generator: Create Unique IDs for SQL Server & C#


What Is a GUID Generator?

A GUID generator is a tool that creates globally unique identifiers—special 128-bit numbers designed to uniquely identify data across computer systems without coordination. GUID stands for Globally Unique IDentifier, and these identifiers appear as 32 hexadecimal digits separated by hyphens, like this: 550e8400-e29b-41d4-a716-446655440000.​

Think of a GUID as a digital license plate that is unique not just in your city or country, but across the entire world. When you create a GUID, you can be virtually certain no one else anywhere will ever generate that exact same number, even without checking with a central authority.​

GUID generators solve a fundamental problem in modern computing: how to create unique identifiers when multiple systems, databases, or applications need to generate IDs independently. Unlike traditional numbering systems that start at 1 and count up—which only work when one system controls the numbers—GUIDs allow every system to create unique IDs simultaneously without conflicts.​

Why GUID Generators Exist: The Problem They Solve

Before GUIDs, databases typically identified records using sequential numbers: 1, 2, 3, and so on. This approach worked perfectly when all data lived in one database on one server. But modern applications face challenges that break this simple model.​

The Database Merging Problem

Imagine two hospitals each maintaining patient databases. Hospital A has 10,000 patients numbered 1 through 10,000. Hospital B has 8,000 patients, also numbered 1 through 8,000. When the hospitals merge, suddenly patient ID 5,000 refers to two completely different people.​

Fixing this requires renumbering thousands of records and updating every table that references those IDs—a massive, error-prone project. With GUIDs, each hospital generates unique identifiers from the start, making merges effortless.​

The Distributed System Challenge

Modern applications run across multiple servers. A mobile app might create a record offline on your phone. Meanwhile, someone else creates a record on a server in another country. If both systems assign the next sequential number, they create duplicates.​

GUIDs eliminate this problem entirely. Each system generates identifiers independently, with virtually zero chance of creating the same GUID.​

The Security Consideration

Sequential IDs create security vulnerabilities. If your customer IDs are sequential, attackers can guess valid IDs by trying numbers in order: customer/1, customer/2, customer/3. This allows them to enumerate all customers even if authorization prevents accessing the actual data.​

Random GUIDs make enumeration computationally impossible. With 10^38 possible values, guessing valid GUIDs would take longer than the age of the universe.​

GUID vs UUID: Are They Different?

You will encounter both terms—GUID and UUID—and wonder if they mean different things. The answer is no: GUIDs and UUIDs are the same thing.​

UUID (Universally Unique IDentifier) is the original term defined by international standards. The Open Software Foundation created the UUID specification for distributed computing in the 1980s.​

Microsoft adopted this standard in the 1990s for Windows and called it GUID (Globally Unique IDentifier). The official UUID specification even acknowledges this: "UUIDs are also known as GUIDs".​

In practical terms:

  • Microsoft technologies (SQL Server, C#, .NET) call them GUIDs​

  • Most other systems call them UUIDs​

  • The underlying technology is identical​

  • They follow the same format and standards​

If someone mentions UUIDs, they mean the same 128-bit identifiers that Microsoft calls GUIDs. This article uses "GUID" since the focus is primarily on Microsoft environments, but everything applies equally to UUIDs.​

Understanding the GUID Format

Every GUID consists of 32 hexadecimal digits (0-9 and A-F) arranged in a specific pattern:​

xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

The hyphens divide the digits into five groups with lengths 8-4-4-4-12. For example:​

550e8400-e29b-41d4-a716-446655440000

What the Components Mean

The seemingly random characters encode specific information:​

First section (8 digits): Time-based or random data depending on generation method​

Second section (4 digits): Additional time or random data​

Third section (4 digits): Starts with the version number (M) which tells you how the GUID was generated. The most common is version 4, indicating random generation.​

Fourth section (4 digits): Starts with variant bits (N) that indicate which GUID standard is followed.​

Fifth section (12 digits): In older algorithms, this contained the network MAC address; in modern random GUIDs, this is random data.​

Storage Size

A GUID occupies 16 bytes (128 bits) of storage. This is:​

  • 4 times larger than a 32-bit integer (4 bytes)

  • 2 times larger than a 64-bit BigInt (8 bytes)​

This size difference matters in databases with millions of records, affecting storage requirements and query performance.​

Generating GUIDs in SQL Server

SQL Server provides built-in functions for GUID generation.​

Using NEWID()

The NEWID() function generates a random GUID:​

sql

SELECT NEWID()

-- Returns: 550e8400-e29b-41d4-a716-446655440000


Creating a table with GUID primary key:

sql

CREATE TABLE Customers (

    Id UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),

    Name VARCHAR(100),

    Email VARCHAR(255)

);


When you insert records without specifying the Id, SQL Server automatically generates a GUID:​

sql

INSERT INTO Customers (Name, Email) 

VALUES ('John Smith', 'john@example.com');

-- Id is auto-generated


Using NEWSEQUENTIALID()

The NEWSEQUENTIALID() function generates sequential GUIDs that increase over time:​

sql

CREATE TABLE Orders (

    Id UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWSEQUENTIALID(),

    CustomerId UNIQUEIDENTIFIER,

    OrderDate DATETIME

);


Important limitation: NEWSEQUENTIALID() can only be used in DEFAULT constraints, not in ad-hoc queries or variables.​

NEWID() vs NEWSEQUENTIALID()

The key differences affect performance and security:​

NEWID() - Random Generation

  • Creates completely random GUIDs​

  • Can be used anywhere (queries, variables, stored procedures)​

  • More secure—GUIDs are unpredictable​

  • Causes index fragmentation when used as clustered index​

  • Slower insert performance​

NEWSEQUENTIALID() - Sequential Generation

  • Creates GUIDs in increasing order​

  • Only works with DEFAULT constraints​

  • Less secure—next GUID is somewhat predictable​

  • Minimal index fragmentation​

  • Much faster insert performance​

Performance comparison on 50,000 records:​

  • NEWID(): 2,486 leaf pages, 69.3% page utilization, 99.2% fragmentation

  • NEWSEQUENTIALID(): 1,725 leaf pages, 99.9% page utilization, 1.0% fragmentation

For database primary keys, NEWSEQUENTIALID() delivers significantly better performance.​

Generating GUIDs in C#

C# provides the Guid struct with simple methods for GUID generation.​

Basic Generation

csharp

using System;


// Generate a new random GUID

Guid newGuid = Guid.NewGuid();

Console.WriteLine(newGuid);

// Output: 550e8400-e29b-41d4-a716-446655440000


The Guid.NewGuid() method generates version 4 (random) GUIDs using cryptographically secure random number generation.​

Creating GUIDs from Strings

csharp

// Parse a string into a Guid

string guidString = "550e8400-e29b-41d4-a716-446655440000";

Guid parsedGuid = Guid.Parse(guidString);


// Try parsing (returns false if invalid)

if (Guid.TryParse(guidString, out Guid result))

{

    Console.WriteLine($"Valid GUID: {result}");

}


Converting GUIDs

csharp

// Convert to string

string guidString = myGuid.ToString();


// Convert to byte array

byte[] bytes = myGuid.ToByteArray();


// Convert to different string formats

string noDashes = myGuid.ToString("N"); 

// 550e8400e29b41d4a716446655440000


string withBraces = myGuid.ToString("B"); 

// {550e8400-e29b-41d4-a716-446655440000}


string withParentheses = myGuid.ToString("P"); 

// (550e8400-e29b-41d4-a716-446655440000)


Using GUIDs in Database Operations

csharp

// Generate GUID for database insert

Guid userId = Guid.NewGuid();


using (SqlCommand cmd = connection.CreateCommand())

{

    cmd.CommandText = @"

        INSERT INTO Users (UserId, Name, Email)

        VALUES (@UserId, @Name, @Email)";

    

    cmd.Parameters.AddWithValue("@UserId", userId);

    cmd.Parameters.AddWithValue("@Name", "John Smith");

    cmd.Parameters.AddWithValue("@Email", "john@example.com");

    

    cmd.ExecuteNonQuery();

}


When to Use GUIDs vs Identity Columns

Choosing between GUIDs and auto-incrementing identity columns depends on your specific requirements.​

Use GUIDs When:

1. Working with distributed systems
Multiple servers need to generate IDs independently without coordination.​

2. Merging databases is likely
Data from different sources needs to combine without ID conflicts.​

3. Offline data generation is required
Mobile apps or disconnected systems create records offline, then sync later.​

4. Security against enumeration matters
Public-facing URLs or APIs benefit from unpredictable IDs.​

5. Replication is used
SQL Server replication scenarios often require GUID columns.​

Use Identity Columns When:

1. Single database environment
All data lives in one database with no merging needs.​

2. Storage space is critical
GUIDs use 4× more space than integers, multiplied across indexes.​

3. Performance is paramount
Identity columns insert faster and create smaller indexes.​

4. Human readability matters
Debugging and support work is easier with simple numbers like "12345" instead of "550e8400-e29b-41d4-a716-446655440000".​

5. Working with data warehousing
Large analytical databases benefit from integer performance.​

Security Considerations

GUIDs have important security implications.​

Are GUIDs Cryptographically Secure?

Version 4 GUIDs generated by Guid.NewGuid() in .NET use cryptographically secure random number generation. Microsoft's implementation wraps Windows API functions that use secure random sources since Windows 2000.​

However, the UUID specification explicitly states: "Do not assume that UUIDs are hard to guess". While .NET's implementation provides good randomness, GUIDs should not be used as security tokens or passwords without additional measures.​

For security-sensitive applications:

  • Use GUIDs for identifiers, not authentication

  • Combine GUIDs with proper authorization checks

  • Do not rely on GUID unpredictability as sole security​

NEWID() vs NEWSEQUENTIALID() Security

NEWID() produces unpredictable, random GUIDs. Attackers cannot guess future values even if they have seen millions of previous GUIDs.​

NEWSEQUENTIALID() creates predictable patterns. Once someone sees a few GUIDs, they can estimate future values. For example, if they see:​

  • 548881A8-C540-EC11-94CF-B46921AB1516

  • 558881A8-C540-EC11-94CF-B46921AB1516

They can guess the next will be:

  • 568881A8-C540-EC11-94CF-B46921AB1516

Never use NEWSEQUENTIALID() for:

  • Public-facing identifiers in URLs

  • Security tokens or session IDs

  • Any scenario where prediction enables attacks​

Performance Implications

GUIDs significantly impact database performance, especially at scale.​

Storage Overhead

Single table with 1 million rows:​

  • Integer primary key: 3.8 MB base table

  • GUID primary key: 15.26 MB base table

With 6 non-clustered indexes:​

  • Integer: 22.89 MB indexes

  • GUID: 91.55 MB indexes

Total database size:

  • Integer: ~25 MB

  • GUID: ~106 MB

The 4× size difference multiplies across the entire database.​

Index Fragmentation

Random GUIDs cause severe fragmentation when used as clustered indexes.​

Why fragmentation occurs:
When a clustered index uses random GUIDs, new rows insert at random positions throughout the index. SQL Server must constantly split pages to make room, leading to:​

  • Partially filled pages

  • More disk space used

  • Slower queries due to fragmented data​

Test results after inserting 20,000 rows:​

NEWID() table:

  • Pages: 218

  • Average free space per page: 2,499.7 bytes

  • High fragmentation

NEWSEQUENTIALID() table:

  • Pages: 152

  • Average free space per page: 69.2 bytes

  • Minimal fragmentation

Sequential GUIDs insert at the end of the index like integers, preventing fragmentation.​

Query Performance

Comparing 16-byte GUIDs is slower than comparing 4-byte integers. However, modern databases optimize GUID comparisons well, making the difference negligible for most applications.​

Performance becomes a concern when:

  • Tables exceed millions of rows​

  • Indexes cannot fit in memory (must read from disk)​

  • Queries join multiple GUID-keyed tables​

Common Mistakes to Avoid

Mistake 1: Using Random GUIDs as Clustered Indexes

The most common GUID mistake is using NEWID() for clustered index primary keys. The random nature causes excessive fragmentation and poor insert performance.​

Solution: Use NEWSEQUENTIALID() for primary keys, or use an integer identity as the clustered index with a GUID as a non-clustered unique key.​

Mistake 2: Storing GUIDs as Strings

Some developers store GUIDs as VARCHAR(36) or CHAR(36). This wastes storage—36 bytes instead of 16—and degrades performance.​

Solution: Always use the UNIQUEIDENTIFIER data type in SQL Server.​

Mistake 3: Using NEWSEQUENTIALID() for Public IDs

Because sequential GUIDs are somewhat predictable, using them in URLs or public APIs enables enumeration.​

Solution: Use NEWID() for any identifier exposed publicly.​

Mistake 4: Not Considering Replication Needs

If you start with identity columns but later need replication, you must add GUID columns and update all related code.​

Solution: Consider future replication needs during initial design.​

Mistake 5: Assuming GUIDs Guarantee Uniqueness

While GUID collisions are astronomically unlikely with proper generation, they are theoretically possible. Faulty random number generators or implementation bugs can create duplicates.​

Solution: Use well-tested libraries (like .NET's built-in Guid.NewGuid()), and handle the extremely rare duplicate gracefully with proper error handling.​

GUID Generation in Other Languages

JavaScript

javascript

// Modern browsers and Node.js 14.17+

const guid = crypto.randomUUID();

console.log(guid);

// 550e8400-e29b-41d4-a716-446655440000


// Using uuid npm package

import { v4 as uuidv4 } from 'uuid';

const guid = uuidv4();


Python

python

import uuid


# Generate random UUID (equivalent to GUID)

guid = uuid.uuid4()

print(guid)

# 550e8400-e29b-41d4-a716-446655440000


PHP

php

<?php

// Generate GUID using COM (Windows)

$guid = com_create_guid();

echo $guid;


// Or use a function

function generateGuid() {

    return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',

        mt_rand(0, 0xffff), mt_rand(0, 0xffff),

        mt_rand(0, 0xffff),

        mt_rand(0, 0x0fff) | 0x4000,

        mt_rand(0, 0x3fff) | 0x8000,

        mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)

    );

}

?>


Java

java

import java.util.UUID;


// Generate random UUID

UUID guid = UUID.randomUUID();

System.out.println(guid);

// 550e8400-e29b-41d4-a716-446655440000


Frequently Asked Questions

1. Can two GUID generators ever create the same GUID?

Mathematically yes, but practically no. With version 4 random GUIDs, there are approximately 5.3 × 10³⁶ possible values.​

To reach a 50% chance of a single collision, you would need to generate about 2.7 × 10¹⁸ GUIDs—that is generating one billion GUIDs every second for 85 years.​

The probability of accidental collision is so low that hardware failures and software bugs are far more likely. If you encounter duplicate GUIDs in practice, it indicates a broken implementation, not genuine bad luck.​

2. Should I use NEWID() or NEWSEQUENTIALID() in SQL Server?

It depends on your priorities:​

Use NEWID() when:

  • Security matters—you need unpredictable IDs​

  • Using GUIDs in non-clustered indexes (performance impact is small)​

  • You need to generate GUIDs outside of DEFAULT constraints​

Use NEWSEQUENTIALID() when:

  • Performance is critical—you're using GUIDs as clustered index primary keys​

  • Fragmentation is a concern in high-volume tables​

  • Security of ID predictability is not important​

For most database primary keys, NEWSEQUENTIALID() is the better choice due to dramatically better performance.​

3. Are GUIDs secure enough to use as passwords or security tokens?

No, you should not use GUIDs directly as passwords or authentication tokens.​

While .NET's Guid.NewGuid() uses cryptographically secure random generation, the UUID specification explicitly warns against using UUIDs for security purposes. GUIDs provide 122 bits of randomness, which is substantial, but they are not designed as cryptographic keys.​

For security purposes:

  • Use dedicated cryptographic libraries like RNGCryptoServiceProvider in .NET

  • If you must use GUID-like identifiers for tokens, enhance them with additional random data

  • Never rely on GUID unpredictability as your only security layer​

GUIDs work well as database identifiers and resource IDs, especially when combined with proper authorization checks.​

4. Why do GUIDs hurt database performance?

GUIDs impact performance in several ways:​

Storage size: GUIDs use 16 bytes versus 4 bytes for integers. This 4× increase multiplies across tables and indexes. A database with GUID keys can easily be 4× larger than one with integer keys.​

Index fragmentation: Random GUIDs (NEWID()) insert at random positions in clustered indexes. This causes page splits—SQL Server allocates new pages and reorganizes data—which slows inserts and fragments the index. Fragmented indexes slow down queries.​

Comparison speed: Comparing two 16-byte values is slower than comparing two 4-byte values, though modern databases handle this well.​

Solutions:

  • Use NEWSEQUENTIALID() to eliminate fragmentation​

  • Use integers as clustered index with GUIDs as non-clustered unique keys​

  • Accept the performance cost if GUID benefits (distribution, merging) outweigh it​

5. Can I generate GUIDs in my application and store them in SQL Server?

Yes, absolutely. This is a common and valid approach.​

csharp

// Generate GUID in C# application

Guid userId = Guid.NewGuid();


// Insert into SQL Server

string sql = @"INSERT INTO Users (UserId, Name) 

               VALUES (@UserId, @Name)";

command.Parameters.AddWithValue("@UserId", userId);


Advantages of application-generated GUIDs:

  • You know the ID before inserting the record​

  • Simpler application code—no need to retrieve auto-generated IDs​

  • Works offline—generate IDs without database connection​

Important: GUIDs generated by Guid.NewGuid() in .NET are compatible with SQL Server's UNIQUEIDENTIFIER type. They follow the same RFC 4122 standard.​

6. What is the UNIQUEIDENTIFIER data type in SQL Server?

UNIQUEIDENTIFIER is SQL Server's data type for storing GUIDs. It is a 16-byte (128-bit) value that follows the RFC 4122 UUID standard.​

sql

CREATE TABLE Products (

    ProductId UNIQUEIDENTIFIER PRIMARY KEY,

    ProductName VARCHAR(100)

);


Key characteristics:

  • Stores GUIDs efficiently in 16 bytes​

  • Can be used as primary keys, foreign keys, or regular columns​

  • Supports automatic generation with NEWID() or NEWSEQUENTIALID()

  • Globally unique across tables, databases, and servers​

Never store GUIDs as VARCHAR(36) or CHAR(36)—this wastes storage and hurts performance.​

7. When should I use GUIDs instead of auto-increment integers?

Choose GUIDs when you have specific needs that integers cannot fulfill:​

Use GUIDs when:

  • Multiple databases will merge data​

  • Distributed systems generate IDs independently​

  • Offline applications create records before syncing​

  • Replication is required​

  • Security against ID enumeration matters​

Use integers when:

  • Single database with no merging needs​

  • Storage and performance are priorities​

  • Human readability and debugging ease matter​

  • No specific GUID benefits apply​

For many applications, integers work perfectly well and offer better performance. Use GUIDs when their specific advantages solve real problems, not just because they seem more sophisticated.​

8. How do I get a new GUID in SQL Server queries?

Use the NEWID() function:​

sql

-- Generate a single GUID

SELECT NEWID() AS NewGuid;


-- Store in a variable

DECLARE @guid UNIQUEIDENTIFIER = NEWID();

SELECT @guid AS MyGuid;


-- Use in INSERT statement

INSERT INTO Customers (CustomerId, Name)

VALUES (NEWID(), 'John Smith');


-- Generate multiple GUIDs

SELECT NEWID() AS Guid1, NEWID() AS Guid2;


Note that NEWSEQUENTIALID() cannot be used in queries—it only works in DEFAULT constraints.​

9. Will GUIDs slow down my application significantly?

It depends on your scale and usage patterns.​

Minimal impact scenarios:

  • Small to medium databases (thousands to hundreds of thousands of rows)​

  • GUIDs used only for reference, not as clustered index​

  • Adequate server memory to cache indexes​

Significant impact scenarios:

  • Very large tables (millions to billions of rows)​

  • Random GUIDs (NEWID()) as clustered index​

  • High-volume insert operations​

  • Memory-constrained servers where indexes must read from disk​

Mitigation strategies:

  • Use NEWSEQUENTIALID() for primary keys​

  • Use integers as clustered index, GUIDs as non-clustered unique keys​

  • Properly index foreign key columns​

  • Ensure adequate server memory​

Many large-scale applications use GUIDs successfully by understanding and managing their performance characteristics.​

10. Are GUIDs generated by C# compatible with SQL Server?

Yes, perfectly compatible. Both use the RFC 4122 UUID standard.​

csharp

// Generate in C#

Guid userId = Guid.NewGuid();

// Output: 550e8400-e29b-41d4-a716-446655440000


// Store in SQL Server

string sql = @"INSERT INTO Users (UserId, Name) 

               VALUES (@UserId, @Name)";

SqlCommand cmd = new SqlCommand(sql, connection);

cmd.Parameters.AddWithValue("@UserId", userId);

cmd.ExecuteNonQuery();


// Retrieve from SQL Server

string query = "SELECT UserId FROM Users WHERE Name = @Name";

SqlCommand cmd2 = new SqlCommand(query, connection);

cmd2.Parameters.AddWithValue("@Name", "John Smith");

Guid retrievedId = (Guid)cmd2.ExecuteScalar();


The Guid type in C# maps directly to UNIQUEIDENTIFIER in SQL Server. No conversion or compatibility layer is needed—they represent the same 128-bit values in the same format.​


Conclusion

GUID generators create globally unique identifiers that solve critical problems in distributed systems, database merging, and offline data generation. These 128-bit values enable multiple systems to create unique IDs independently without coordination, making them essential for modern applications.​

Understanding when to use GUIDs versus traditional identity columns requires evaluating your specific needs. GUIDs excel in distributed environments, replication scenarios, and situations requiring unpredictable identifiers. However, they consume more storage and can impact performance if used incorrectly.​

The choice between NEWID() and NEWSEQUENTIALID() in SQL Server significantly affects performance. Random GUIDs provide better security but cause index fragmentation. Sequential GUIDs dramatically improve database performance but are somewhat predictable.​

Whether you generate GUIDs in C# with Guid.NewGuid(), in SQL Server with NEWID(), or through other languages and frameworks, understanding their strengths, limitations, and proper usage ensures your applications benefit from GUIDs without suffering unnecessary performance penalties.​


Comments

Popular posts from this blog

IP Address Lookup: Find Location, ISP & Owner Info

1. Introduction: The Invisible Return Address Every time you browse the internet, send an email, or stream a video, you are sending and receiving digital packages. Imagine receiving a letter in your physical mailbox. To know where it came from, you look at the return address. In the digital world, that return address is an IP Address. However, unlike a physical envelope, you cannot simply read an IP address and know who sent it. A string of numbers like 192.0.2.14 tells a human almost nothing on its own. It does not look like a street name, a city, or a person's name. This is where the IP Address Lookup tool becomes essential. It acts as a digital directory. It translates those cryptic numbers into real-world information: a city, an internet provider, and sometimes even a specific business name. Whether you are a network administrator trying to stop a hacker, a business owner checking where your customers live, or just a curious user wondering "what is my IP address location?...

Rotate PDF Guide: Permanently Fix Page Orientation

You open a PDF document and the pages display sideways or upside down—scanned documents often upload with wrong orientation, making them impossible to read without tilting your head. Worse, when you rotate the view and save, the document opens incorrectly oriented again the next time. PDF rotation tools solve this frustration by permanently changing page orientation so documents display correctly every time you open them, whether you need to rotate a single misaligned page or fix an entire document scanned horizontally. This guide explains everything you need to know about rotating PDF pages in clear, practical terms. You'll learn why rotation often doesn't save (a major source of user frustration), how to permanently rotate pages, the difference between view rotation and page rotation, rotation options for single or multiple pages, and privacy considerations when using online rotation tools. What is PDF Rotation? PDF rotation is the process of changing the orientation of pages...

QR Code Guide: How to Scan & Stay Safe in 2026

Introduction You see them everywhere: on restaurant menus, product packages, advertisements, and even parking meters. Those square patterns made of black and white boxes are called QR codes. But what exactly are they, and how do you read them? A QR code scanner is a tool—usually built into your smartphone camera—that reads these square patterns and converts them into information you can use. That information might be a website link, contact details, WiFi password, or payment information. This guide explains everything you need to know about scanning QR codes: what they are, how they work, when to use them, how to stay safe, and how to solve common problems. What Is a QR Code? QR stands for "Quick Response." A QR code is a two-dimensional barcode—a square pattern made up of smaller black and white squares that stores information.​ Unlike traditional barcodes (the striped patterns on products), QR codes can hold much more data and can be scanned from any angle.​ The Parts of a ...