K

How to Generate UUID in Kotlin

Android & Kotlin Multiplatform

Use the code examples below to generate UUIDs in Kotlin with java.util.UUID for JVM and Android projects, or leverage Kotlin Multiplatform approaches for cross-platform UUID generation. Copy these Kotlin UUID snippets into your Android apps, Ktor server applications, or multiplatform modules for unique identifier creation with Room database integration, idiomatic extension functions, and type-safe UUID handling across all Kotlin targets.

Generate UUID in Kotlin

UUID.randomUUID()
550e8400-e29b-41d4-a716-446655440000

Kotlin UUID Generation: Quick Start Guide

Android

Full support with java.util.UUID

KMP

Kotlin Multiplatform ready

Room DB

Native Room integration

Kotlin
import java.util.UUID

// Generate random UUID v4
val uuid = UUID.randomUUID()
println(uuid)  
// Output: 550e8400-e29b-41d4-a716-446655440000

// Get as string
val uuidString = uuid.toString()

// Generate list of UUIDs (Kotlin idiom)
val uuids = List(5) { UUID.randomUUID() }
uuids.forEach { println(it) }

Kotlin Extension Functions for UUID Operations

Create idiomatic Kotlin extensions for common UUID operations:

UUID Extensions

// Extension functions for UUID
fun String.toUUIDOrNull(): UUID? = runCatching {
    UUID.fromString(this)
}.getOrNull()

fun String.isValidUUID(): Boolean = 
    toUUIDOrNull() != null

// Usage examples
val valid = "550e8400-e29b-41d4-a716-446655440000"
val invalid = "not-a-uuid"

println(valid.isValidUUID())    // true
println(invalid.isValidUUID())  // false

val uuid = valid.toUUIDOrNull()  // UUID object or null

Android Room Database UUID Integration

Entity with UUID Primary Key

import androidx.room.Entity
import androidx.room.PrimaryKey
import java.util.UUID

@Entity(tableName = "users")
data class User(
    @PrimaryKey
    val id: String = UUID.randomUUID().toString(),
    val name: String,
    val email: String,
    val createdAt: Long = System.currentTimeMillis()
)

TypeConverter for UUID Objects

import androidx.room.TypeConverter
import java.util.UUID

class UUIDConverter {
    @TypeConverter
    fun fromUUID(uuid: UUID?): String? = uuid?.toString()
    
    @TypeConverter
    fun toUUID(value: String?): UUID? = value?.let { 
        runCatching { UUID.fromString(it) }.getOrNull()
    }
}

// Usage in Entity
@Entity
data class Product(
    @PrimaryKey
    val id: UUID = UUID.randomUUID(),
    val name: String
)

DAO with UUID Queries

import androidx.room.*
import kotlinx.coroutines.flow.Flow

@Dao
interface UserDao {
    @Insert
    suspend fun insert(user: User)
    
    @Query("SELECT * FROM users WHERE id = :userId")
    suspend fun getUserById(userId: String): User?
    
    @Query("SELECT * FROM users")
    fun getAllUsers(): Flow>
    
    @Delete
    suspend fun delete(user: User)
}

Kotlin Data Class with UUID Factory

Kotlin Data Class
import java.util.UUID

data class Task(
    val id: UUID = UUID.randomUUID(),
    val title: String,
    val description: String = "",
    val completed: Boolean = false,
    val createdAt: Long = System.currentTimeMillis()
) {
    companion object {
        fun create(title: String, description: String = ""): Task {
            return Task(
                title = title,
                description = description
            )
        }
    }
}

// Usage
val task1 = Task.create("Buy groceries", "Milk, eggs, bread")
val task2 = Task(title = "Call dentist")

println(task1.id)  // Auto-generated UUID
println(task2.id)  // Different UUID

Comparison: UUID vs Other ID Strategies

Strategy Pros Cons Best For
UUID Globally unique, no conflicts 36 chars, not sortable Distributed systems
Auto-increment Short, sortable Sequential, conflicts Single database
ULID Sortable, unique Needs library Time-ordered data
Timestamp Sortable, readable Not unique Logging only

ViewModel UUID State Management

TaskViewModel.kt
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import java.util.UUID

class TaskViewModel(
    private val repository: TaskRepository
) : ViewModel() {
    
    private val _tasks = MutableStateFlow>(emptyList())
    val tasks: StateFlow> = _tasks.asStateFlow()
    
    fun addTask(title: String, description: String) {
        val task = Task(
            id = UUID.randomUUID(),
            title = title,
            description = description
        )
        
        viewModelScope.launch {
            repository.insert(task)
            loadTasks()
        }
    }
    
    fun getTaskById(id: UUID): Task? {
        return _tasks.value.find { it.id == id }
    }
    
    fun deleteTask(taskId: UUID) {
        viewModelScope.launch {
            _tasks.value.find { it.id == taskId }?.let {
                repository.delete(it)
                loadTasks()
            }
        }
    }
    
    private fun loadTasks() {
        viewModelScope.launch {
            repository.getAllTasks().collect {
                _tasks.value = it
            }
        }
    }
}

Compose UI with UUID Keys

TaskListScreen.kt
@Composable
fun TaskListScreen(
    viewModel: TaskViewModel = viewModel()
) {
    val tasks by viewModel.tasks.collectAsState()
    
    LazyColumn {
        items(
            items = tasks,
            key = { task -> task.id.toString() }  // UUID as key
        ) { task ->
            TaskItem(
                task = task,
                onDelete = { viewModel.deleteTask(task.id) }
            )
        }
    }
}

@Composable
fun TaskItem(
    task: Task,
    onDelete: () -> Unit
) {
    Card(
        modifier = Modifier
            .fillMaxWidth()
            .padding(8.dp)
    ) {
        Row(
            modifier = Modifier.padding(16.dp),
            horizontalArrangement = Arrangement.SpaceBetween
        ) {
            Column {
                Text(text = task.title, style = MaterialTheme.typography.titleMedium)
                Text(text = task.id.toString().take(8), style = MaterialTheme.typography.bodySmall)
            }
            IconButton(onClick = onDelete) {
                Icon(Icons.Default.Delete, contentDescription = "Delete")
            }
        }
    }
}

Related Programming Language UUID Guides

Comments & Feedback

Share your experience or ask questions about this tool

Copied!