none
(Sumber: milist DOTNET) UuidCreateSequential RRS feed

  • Pertanyaan

  • Teman teman,

    Ada yang pernah menerapkan UuidCreateSequential di production?

    Saya sudah berhasil mencoba code di link berikut.

    http://pinvoke.net/default.aspx/rpcrt4/UuidCreateSequential.html

    [DllImport("rpcrt4.dll", SetLastError=true)] static extern int UuidCreateSequential(out Guid guid);

    static Guid UuidCreateSequential()

    {

        const int RPC_S_OK = 0;

        Guid g;

        int hr = UuidCreateSequential(out g);

        if (hr != RPC_S_OK)

          throw new ApplicationException

            ("UuidCreateSequential failed: " + hr);

        return g;

    }

    UuidCreateSequential generates sequential GUIDs like these:

    19F287B4-8830-11D9-8BFC-000CF1ADC5B7

    19F287B5-8830-11D9-8BFC-000CF1ADC5B7

    19F287B6-8830-11D9-8BFC-000CF1ADC5B7

    19F287B7-8830-11D9-8BFC-000CF1ADC5B7

    19F287B8-8830-11D9-8BFC-000CF1ADC5B7

    Here is a summary of the differences in the output of UuidCreateSequential:

    - The last six bytes reveal your MAC address

    - Several GUIDs generated in a row are sequential

    Mohon sarannya kalau ada kelemahan teknik di atas atau ada alternatif yg lebih baik.

    Terima kasih.


    Agnes Sannie [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    Rabu, 23 Mei 2012 09.08
    Moderator

Jawaban

  • Sebenarnya tidak ada yang salah dengan kode Anda, namun kalau tujuan akhir Anda menggunakan Sequential GUID adalah untuk disimpan kedalam SQL Server — apalagi sebagai PK — mungkin yang harus dipertimbangkan adalah masalah SQL Server Ordering untuk output dari fungsi Anda.


    SQL Server memiliki behavior yang berbeda untuk ordering GUID [http://sqlblog.com/blogs/alberto_ferrari/archive/2007/08/31/how-are-guids-sorted-by-sql-server.aspx].
    Konsekuensinya sequential guid yang Anda generate melalui fungsi UuidCreateSequential() bisa jadi tidak diurutkan sebagaimana keinginan Anda oleh SQL Server.

    Sebagai workaround (kalau memang value dari sequential GUID ini untuk disimpan di SQL Server), Anda bisa mendelegate task ini ke dalam stored procedure atau column default value dan menggunakan fungsi newsequentialid() dari SQL Server yang sudah di support sejak SQL Server 2005 — kecuali untuk SQL Azure, still unsupported. Fungsi newsequentialid() ini sendiri sebenarnya adalah wrapper untuk fungsi UuidCreateSequential() hanya saja dalam implementasinya beberapa urutan bytes di modifikasi [http://msdn.microsoft.com/en-us/library/ms189786%28v=SQL.105%29.aspx].

    Lalu bagaimana kalau tujuan awalnya adalah justru agar sequential guid bisa di generate di client bukan di server? Berarti Anda harus melakukan hal yang sama seperti fungsi newsequentialid() yaitu men-swap/ re-order bytes yang dihasilkan oleh fungsi UuidCreateSequential() sebelum digunakan di return dari fungsi dan digunakan sebagai sequential GUID.

    Dijawab oleh: Jakka


    Agnes Sannie [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    Rabu, 23 Mei 2012 09.09
    Moderator