10/12/09

Duplikasi UUID

Menurut Wikipedia,

… the probability is about 0.00000000006 (6 × 10−11), equivalent to the odds of creating a few tens of trillions of UUIDs in a year and having one duplicate.

However, these probabilities only hold when the UUIDs are generated using sufficient entropy. Otherwise the probability of duplicates may be significantly higher, since the statistical dispersion may be lower.

Ceritanya saya lg bikin aplikasi yg cukup tergantung dengan UUID. Aplikasi ini akan nerima request, membuat sebuah UUID, lalu diasosiasikan dengan data yg dikirim pada request tersebut. Bisa dibilang cukup tergantung karena keunikan UUID yang dibuat itu bisa jadi menjadi harga mati yg harus dipenuhi. Semua ID yang dibuat harus unik, gak boleh tidak. Yang menjadi masalah adalah kemarin saya menemukan ID yang sama :( bahkan saya selalu bisa mereproduksi masalahnya T_T

Aplikasi yg saya bikin ini ditulis dengan Python dan memakai CherryPy tuk HTTP framework. Saya menemukan kasus ini ketika saya menjalankan aplikasi tsb dengan Python 2.5.2 bawaan Ubuntu 8.04.3 (i386) dan Python 2.5.1 yg ada di Fedora 8 (amd64). Saat itu saya mencoba melakukan benchmark aplikasi dengan Apache Benchmark dengan membuat 1024 requests dalam 16 concurrent connections.

Sebagai informasi, CherryPy ini adalah sebuah HTTP framework multi-threading jadi setiap koneksi masuk akan ditangani oleh satu thread berbeda..

Kalau mau diperas sampe habis, kira2 ini aplikasi yg saya buat.

import cherrypy
import uuid

class Root(object):
    @cherrypy.expose
    def index(self):
        id = uuid.uuid4()
        id = str(id)
        print "#%s@" % id
        return ''

cherrypy.config.update({'log.screen': False,
                        'environment': 'production'})
cherrypy.quickstart(Root())

Oh iya, UUID yang saya pakai itu adalah UUID versi 4 yg menggunakan random number generator dalam pembuatan UUIDnya.

Setelah itu saya jalankan aplikasi tsb seperti berikut.

$ python2.5 test.py > daftar

Apache Benchmark lalu saya jalankan tuk membuat 1024 requests dalam 16 concurrent connections.

$ ab -n 1024 -c 16 http://127.0.0.1:8080/

Setelah selesai, saya cek berkas daftar yang terbentuk, memastikan 1 baris hanya berisi 1 buah UUID. Lalu jadikan isi berkas tsb menjadi unik dan membandingkan hasilnya.

$ sort -u daftar > unik
$ wc -l daftar unik

Seharusnya kedua berkas tersebut memiliki jumlah baris yang sama yang berarti setiap baris adalah unik. Namun sayangnya, saya tidak menjumpai hal tsb :(

Berhubung masih penasaran, saya akhirnya nyoba menggunakan Python 2.5.4 dan Python 2.6.4 hasil kompilasi sendiri di mesin Fedora tsb. Saya melakukan pengujian hal yang sama dan hasil yg saya temui adalah saya masih menemukan duplikasi UUID pada saat menggunakan Python 2.5.4. Sedangkan penggunaan Python 2.6.4 memberikan hasil yang saya harapkan, tidak ada duplikasi UUID.

Apa ini artinya Python 2.5.x bermasalah dalam hal ini? Saya belum menemukan kasus serupa setelah nyoba2 googling. Ada yang punya informasi lbh?

Ups, belum juga tulisan ini dipublish, saya dah nemuin sumber masalahnya :D Tadi salah kata kunci spertinya hehehe.. intinya adalah Python 2.5 memang memiliki bug di UUIDv4 generatornya. Silakan baca http://bugs.python.org/issue4607

Oh ya lagi.. asya dah nyoba jg pake UUIDv1 tapi ternyata masalah masih ada di Python 2.5 :(

0 komentar:

Poskan Komentar