গো ভাষার সাথে একটি ইউআইডি উত্পন্ন করার জন্য কি কোনও পদ্ধতি আছে?


109

আমার কাছে এমন কোড রয়েছে যা দেখতে দেখতে:

u := make([]byte, 16)
_, err := rand.Read(u)
if err != nil {
    return
}

u[8] = (u[8] | 0x80) & 0xBF // what does this do?
u[6] = (u[6] | 0x40) & 0x4F // what does this do?

return hex.EncodeToString(u)

এটি 32 দৈর্ঘ্যের দৈর্ঘ্যের সাথে একটি স্ট্রিং প্রদান করে, তবে আমি মনে করি না এটি একটি বৈধ ইউআইউডি। এটি যদি সত্যিকারের ইউআইডি হয় তবে এটি কোনও ইউইউডি কেন এবং কোডটির উদ্দেশ্য কী যা এর মান u[8]এবং সংশোধন করে u[6]

ইউআইডিগুলি উত্পন্ন করার আরও ভাল উপায় কি নেই?


1
এই উত্তরটি এখন আরও উপযুক্ত বলে মনে হচ্ছে।
ভাইকিগ

উত্তর:


32
u[8] = (u[8] | 0x80) & 0xBF // what's the purpose ?
u[6] = (u[6] | 0x40) & 0x4F // what's the purpose ?

এই রেখাগুলি একটি নির্দিষ্ট ব্যাপ্তিতে বাইট 6 এবং 8 এর মানগুলিকে ক্ল্যাম্প করে। rand.Readপরিসরে এলোমেলো বাইটগুলি প্রদান করে 0-255, যা কোনও ইউইউডির জন্য সমস্ত বৈধ মান নয়। যতদূর আমি বলতে পারি, এটি স্লাইসে সমস্ত মানগুলির জন্য করা উচিত।

আপনি যদি লিনাক্সে থাকেন তবে আপনি বিকল্পভাবে কল করতে পারেন /usr/bin/uuidgen

package main

import (
    "fmt"
    "log"
    "os/exec"
)

func main() {
    out, err := exec.Command("uuidgen").Output()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%s", out)
}

যা ফলন দেয়:

$ go run uuid.go 
dc9076e9-2fda-4019-bd2c-900a8284b9c4

23
উল্লেখযোগ্যভাবে, এই পদ্ধতির ধীর গতি; একটি 2012 ম্যাকবুক এয়ারে এই কৌশলটি কেবল 170 টি ইউউইড / সেকেন্ড উত্পাদন করতে পারে।
জে টেলর

12
এবং nu7hatch / gouuid লাইব্রেরি ব্যবহার করে, আমি 172,488 uuids / সেকেন্ড উত্পাদন করতে সক্ষম হয়েছিল
জে টেলর

2
বাইটস u[6]এবং এর ভাল ব্যাখ্যা u[8]
চৌই

3
আমার সিস্টেমে (উবুন্টু 15.10) নতুন ক্যারেক্টারটি সরানোর জন্য আমারও কমান্ড আউটপুটটি স্ট্রিংয়ের মাধ্যমে চালানো দরকার T ফাইল সিস্টেমে অক্ষর।
gregtczap

39
একটি বাহ্যিক প্রোগ্রাম কল করা যা উপস্থিত থাকতে পারে বা নাও থাকতে পারে এই মোটামুটি সহজ কাজটি করার একটি ভয়াবহ উপায়।
টিএমএমএম

96

আপনি গো-ইউইড লাইব্রেরি ব্যবহার করে ইউআইডিগুলি তৈরি করতে পারেন । এটি এর সাথে ইনস্টল করা যেতে পারে:

go get github.com/nu7hatch/gouuid

আপনি এলোমেলোভাবে (সংস্করণ 4) ইউআইডিগুলি উত্পাদন করতে পারেন:

import "github.com/nu7hatch/gouuid"

...

u, err := uuid.NewV4()

ফিরে আসা UUIDটাইপটি একটি 16 বাইট অ্যারে, যাতে আপনি সহজেই বাইনারি মানটি পুনরুদ্ধার করতে পারেন। এটি এর String()পদ্ধতির মাধ্যমে মানক হেক্স স্ট্রিং উপস্থাপনাও সরবরাহ করে ।

আপনি যে কোডটি দেখতে পেয়েছেন তা দেখে মনে হচ্ছে এটি বৈধ সংস্করণ 4 ইউআইডিও উত্পন্ন করবে: আপনি শেষে যে বিটওয়াইস ম্যানিপুলেশনটি সম্পাদন করেছেন তা ইউআইডির সংস্করণ এবং বৈকল্পিক ক্ষেত্রগুলিকে সংস্করণ 4 হিসাবে সঠিকভাবে সনাক্ত করার জন্য সেট করে । এটি অন্যান্য অ্যালগরিদমের মাধ্যমে উত্পন্ন উত্সগুলি থেকে র্যান্ডম ইউআইডিগুলিকে আলাদা করার জন্য করা হয় (উদাহরণস্বরূপ সংস্করণ 1 ইউএইউডিগুলি আপনার ম্যাকের ঠিকানা এবং সময়ের উপর ভিত্তি করে)।


2
@ ফ্লিমজি এমন লোকদের জন্য যারা জানেন না যে তারা কী করছেন যা সম্ভবত সম্ভবত সত্য। অপ্রয়োজনীয় নির্ভরতা পরিচয় করিয়ে দেওয়া সর্বদা একটি খারাপ জিনিস।
এরিক অাইনার

31
@ এরিকএগনার যতক্ষণ না এটি 50 টি লাইন আমার সম্পর্কে চিন্তা করা, লেখার এবং পরীক্ষা করার দরকার নেই, আমি তাদের ধন্যবাদ জানাবো .. চাকাটি পুনরায় সজ্জিত করার জন্য আমার কাছে অন্যান্য জিনিস রয়েছে।
রিকিআ

3
এই লাইব্রেরিটি দেখে মনে হচ্ছে এটি আসলে আরএফসি 4122 অনুসারে নয়: github.com/nu7hatch/gouuid/issues/28 (বর্তমানে 2/1/2016 হিসাবে প্রকাশিত ইস্যু)
চার্লস এল

1
@ এরিকআিগনার চাকাটিকে পুনর্বহাল করাও কিছুটা অপ্রয়োজনীয়। যদি কোনও লাইব্রেরি বিদ্যমান থাকে এবং আপনি যদি এটি কীভাবে করবেন তা শেখার জন্য এটি করা ব্যতীত অন্য নিজের থেকে কেন বিরক্ত করবেন তা যদি ভাল করে।
স্যার

4
@ ইরাকএইগনার আমি কেবল এটি হাস্যকর দেখতে পাই। ইতিমধ্যে সম্পন্ন জিনিসগুলি কেউ পুনরায় নতুন করে না দেয় যদি না আপনি আরও ভাল করতে পারেন বা আপনার প্রোগ্রামের জন্য নির্দিষ্ট কিছু প্রয়োজন না চান, যদি আপনি কোডটি পরীক্ষা করেন এবং দেখেন যে এটি নিজেরাই কেন বিরক্ত করে - আপনি কেবল উন্নয়নের সময় এবং ব্যয়ই নষ্ট করেন না, আপনিও হন আপনি কী করছেন তা পুরোপুরি না জানলে সম্ভাব্যভাবে বাগগুলি বা কেবলমাত্র কার্যকর বাস্তবায়ন আনতে চলেছে, সাধারণত এই লাইব্রেরিগুলিকে এমন লোক তৈরি করা হয় যারা জানেন যে তারা কী করছে। এটি তৃতীয় পক্ষের লাইব্রেরিগুলি ব্যবহার করা নকল নয়, এটির কাজটি ধরে নেওয়া এবং কোডটি প্রথমে পরিদর্শন না করার জন্য এটির একমাত্র
স্যার

70

go-uuidগ্রন্থাগার RFC4122 অনুবর্তী নয়। বৈকল্পিক বিটগুলি সঠিকভাবে সেট করা নেই। সম্প্রদায়ের সদস্যদের দ্বারা এটি স্থির করার জন্য বেশ কয়েকটি প্রচেষ্টা করা হয়েছে তবে ফিক্সটির জন্য টানুন অনুরোধগুলি গ্রহণ করা হচ্ছে না।

আপনি লাইব্রেরির উপর ভিত্তি করে আমি আবার লিখেছি গো উয়েড লাইব্রেরি ব্যবহার করে আপনি ইউআইডিগুলি তৈরি করতে পারেন go-uuid। বেশ কয়েকটি সংশোধন ও উন্নতি রয়েছে। এটি এর সাথে ইনস্টল করা যেতে পারে:

go get github.com/twinj/uuid

আপনি এলোমেলোভাবে (সংস্করণ 4) ইউআইডিগুলি উত্পাদন করতে পারেন:

import "github.com/twinj/uuid"

u := uuid.NewV4()

ফিরে আসা ইউআইডি টাইপটি একটি ইন্টারফেস এবং অন্তর্নিহিত প্রকারটি একটি অ্যারে।

গ্রন্থাগারটিও ভি 1 ইউআইডি উত্পন্ন করে এবং সঠিকভাবে ভি 3 এবং 5 ইউআইডি উত্পন্ন করে। মুদ্রণ এবং ফর্ম্যাটেটিংয়ে সহায়তা করার জন্য বেশ কয়েকটি নতুন পদ্ধতি রয়েছে এবং বিদ্যমান ডেটার ভিত্তিতে ইউআইডি তৈরির জন্য নতুন সাধারণ পদ্ধতিও রয়েছে।


4
আমি এই প্যাকেজ পছন্দ। আমি আমার সমস্ত অ্যাপ্লিকেশনগুলির জন্য এটি আনুষ্ঠানিকভাবে গ্রহণ করেছি। আমি দেখতে পেলাম যে nu7hatch প্যাকেজটি আরএফসি 4122-অনুসারী নয়।
রিচার্ড

+1 সম্মত হয়েছে, আপডেট এবং মুদ্রণ / ফর্ম্যাটিং এক্সটেনশানগুলি ইতিমধ্যে অন্তর্ভুক্ত রয়েছে।
eduncan911

4
দাবি অস্বীকার? : পি
চકૃત

3
"নীচে" গ্রন্থাগারটি কী? আপনার উপর এবং নীচে এসওতে ব্যবহার করা এড়ানো উচিত কারণ এটি দ্রুত পরিবর্তন হতে পারে।
স্টিফান ডলবার্গ

এখানে আরও একটি সমতুল্য, সাতোরি / go.uuid রয়েছে । এটি এখনও চেষ্টা করে দেখেনি তবে আমি এটিকে
নু

52

"ক্রিপ্টো / র্যান্ড" র্যান্ডম বাইট জেনারেটেশনের জন্য ক্রস প্ল্যাটফর্ম পিকেজি

package main

import (
    "crypto/rand"
    "fmt"
)

// Note - NOT RFC4122 compliant
func pseudo_uuid() (uuid string) {

    b := make([]byte, 16)
    _, err := rand.Read(b)
    if err != nil {
        fmt.Println("Error: ", err)
        return
    }

    uuid = fmt.Sprintf("%X-%X-%X-%X-%X", b[0:4], b[4:6], b[6:8], b[8:10], b[10:])

    return
}

3
pseudo_uuidকারণ এটি ম্যাক ঠিকানার মতো নন-এলোমেলো শনাক্তকারী এবং নিখুঁত আরএফসি 4122 মিস করছে? সুতরাং এটি আসলে আরও এলোমেলো।
ক্লোনক্রস

2
ভাল উত্তর; আমি এটি স্ট্যাকওভারফ্লো .com/a/48134820/1122270 এ প্রসারিত করেছি এবং আমি মনে করি অনেক লোককে আসলে ইউআইডিগুলি বিশেষভাবে ব্যবহার করার দরকার নেই (না যে শ 1 / শ 256 যা আমি ভেবেছিলাম আমার নিজের র্যান্ডম- আইডি সমস্যা), কিন্তু কেবল কিছু র্যান্ডম এবং অনন্য চান, এবং আপনার নমুনা একটি সমাধান জন্য একটি ভালো শুরু উপলব্ধ
cnst

ধন্যবাদ! যথেষ্ট সহজ
কার্ল পোকাস

১. এটি কোনও মান মেনে চলে না ২. মাত্র %x১২৮ এর চেয়ে কম বাইট মান সহ সমস্যাগুলি ব্যবহার করে আপনাকে প্যাডিং প্রয়োগ করতে হবে, অর্থাৎ %04xবাইট
জোড়ির

38

গুগলের একটি অফিসিয়াল বাস্তবায়ন রয়েছে: https://github.com/google/uuid

একটি সংস্করণ 4 ইউআইডি তৈরি করা এইভাবে কাজ করে:

package main

import (
    "fmt"
    "github.com/google/uuid"
)

func main() {
    id := uuid.New()
    fmt.Println(id.String())
}

এটি এখানে চেষ্টা করুন: https://play.golang.org/p/6YPi1djUMj9


1
Godoc ব্যবহার বিশেষ পরামর্শ দেওয়া হচ্ছে New()এবং এটি সমতূল্যuuid.Must(uuid.NewRandom())
জিম

@ জিম: আপনি ঠিক বলেছেন! আমি আমার উত্তর অনুসারে আপডেট করেছি।
shutefan

মনে রাখবেন যে নতুন () "মারাত্মক" হতে পারে (যা কিছু ক্ষেত্রে ঠিক আছে)। আপনি যদি চান না যে আপনার প্রোগ্রামটি মারাত্মক মাত্র uuid.NewRandom () ব্যবহার করুন - যা একটি ইউইউডি এবং ত্রুটি প্রদান করে।
টোমর

@ টমর: সত্য! যদিও আমি ভাবছি কোন পরিস্থিতিতে এটি আসলে ঘটবে। এটি কোডের প্রাসঙ্গিক অংশ: github.com/google/uuid/blob/… ডিফল্টরূপে পাঠক হ'ল একটি rand.Reader। আমি নিশ্চিত নই যে যদি কেউ কোনও ত্রুটি ফিরিয়ে দেয় বা এটি কেবল কাস্টম পাঠকের সাথেই ঘটতে পারে ...
শুতেফান

1
হাই @ শুটেফান - আমি সম্মত হই যে এটি বিরল হতে পারে। rand.Reader কার্নেল ফাংশন কল করে ( golang.org/src/crypto/rand/rand.go )। এগুলি নির্দিষ্ট পরিস্থিতিতে ব্যর্থ হতে পারে।
টমর

24

gofrs / uuid হল satori / go.uuid এর প্রতিস্থাপন , যা গো-র জন্য সবচেয়ে বেশি তারকাচিহ্নিত UID প্যাকেজ । এটি ইউআইডি সংস্করণগুলিকে 1-5 সমর্থন করে এবং এটি আরএফসি 4122 এবং ডিসিই 1.1 অনুগামী।

import "github.com/gofrs/uuid"

// Create a Version 4 UUID, panicking on error
u := uuid.Must(uuid.NewV4())

12

রাশ কক্স এর পোস্ট থেকে :

কোনও অফিসিয়াল লাইব্রেরি নেই। ত্রুটি যাচাই করা উপেক্ষা করে মনে হচ্ছে এটি ঠিকঠাক কাজ করবে:

f, _ := os.Open("/dev/urandom")
b := make([]byte, 16)
f.Read(b)
f.Close()
uuid := fmt.Sprintf("%x-%x-%x-%x-%x", b[0:4], b[4:6], b[6:8], b[8:10], b[10:])

দ্রষ্টব্য: মূল, প্রাক গো 1 সংস্করণে প্রথম লাইনটি ছিল:

f, _ := os.Open("/dev/urandom", os.O_RDONLY, 0)

এখানে এটি সংকলন এবং সম্পাদন করে, কেবলমাত্র/dev/urandom খেলার মাঠের সমস্ত জিরো প্রদান করে। স্থানীয়ভাবে কাজ করা উচিত।

একই থ্রেডে আরও কিছু পদ্ধতি / রেফারেন্স / প্যাকেজ পাওয়া গেছে।


12
এটি যদিও কোনও বৈধ ইউআইডি উত্পন্ন করবে না: সংস্করণ 4 ইউআইডিগুলি (র্যান্ডম ডেটার উপর ভিত্তি করে টাইপ) অ-র্যান্ডম ইউআইডি ফর্ম্যাটগুলির সাথে বিরোধ না এড়াতে কয়েকটি বিট নির্দিষ্ট উপায়ে সেট করতে হবে।
জেমস হেনস্ট্রিজ

4
import "crypto/rand"আমার মতে ব্যবহার করা ভাল , তবে +1 uuid := fmt.Sprintf("%x-%x-%x-%x-%x", b[0:4], b[4:6], b[6:8], b[8:10], b[10:])। ওপির কোডের সাথে সংযুক্ত এবং এটি দুর্দান্ত কাজ করে।
চৌবি

2
ক্রিপ্টো / র্যান্ড প্যাকেজটি ব্যবহার করুন: play.golang.org/p/7JJDx4GL77 । zzzz এর কোড ক্রিপ্ট / র্যান্ড যা করে তা করে, এটি ছাড়াও এমন প্ল্যাটফর্মগুলিও আবৃত করে যা / dev / urandom (উইন্ডোজ) সমর্থন করে না।
ড্র হয়েছে

এটি লক্ষ করা উচিত যে এটি প্ল্যাটফর্ম নির্দিষ্ট
ড্যান এস্পারজা

2
@ ম্যাট: সমস্যাটি হ'ল অন্যান্য ইউআইডি ফর্ম্যাটগুলি অন্য কোনও কর্তৃপক্ষের কাছে অর্পণ করে (যেমন আপনার ইথারনেট ম্যাকের ঠিকানাটি অনন্য) এবং তারপরে এটি অন্য কোনও কিছুর সাথে মিশ্রিত করে (যেমন সময় এবং একটি কাউন্টার)। আপনি যদি একটি র্যান্ডম ইউআইডি উত্পাদন করেন যা সঠিকভাবে ভি 4 হিসাবে ফর্ম্যাট হয় না, আপনি সিস্টেমটিকে দুর্বল করছেন।
জেমস হেনস্ট্রিজ

8

ইউইডির অনুমানের অংশ হিসাবে, আপনি যদি এলোমেলোভাবে একটি ইউইড তৈরি করেন তবে এতে অবশ্যই ১৩ তম অক্ষর হিসাবে একটি "4" এবং 17 তম ( উত্স ) এর "8", "9", "ক" বা "বি" থাকতে হবে ।

// this makes sure that the 13th character is "4"
u[6] = (u[6] | 0x40) & 0x4F
// this makes sure that the 17th is "8", "9", "a", or "b"
u[8] = (u[8] | 0x80) & 0xBF 

4

Gorand প্যাকেজ একটি UUID পদ্ধতি যা আয় একটি সংস্করণ 4 (এলোমেলোভাবে জেনারেট) UUID তার ক্যানোনিকাল স্ট্রিং প্রতিনিধিত্ব ( "xxxxxxxxxxxx-XXXXXXXX-xxxxxxxxxxxx") এবং এটা বোঝায় যা RFC 4122 অনুবর্তী হয়েছে।

গো দ্বারা সমর্থিত সমস্ত প্ল্যাটফর্ম জুড়ে সর্বাধিক ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত ইউআইডিগুলির সুরক্ষা নিশ্চিত করতে এটি ক্রিপ্টো / র্যান্ড প্যাকেজ ব্যবহার করে।

import "github.com/leonelquinteros/gorand"

func main() {
    uuid, err := gorand.UUID()
    if err != nil {
        panic(err.Error())
    }

    println(uuid)
} 

4

লিনাক্সে, আপনি এগুলি থেকে পড়তে পারেন /proc/sys/kernel/random/uuid:

package main

import "io/ioutil"
import "fmt"

func main() {
    u, _ := ioutil.ReadFile("/proc/sys/kernel/random/uuid")
    fmt.Println(string(u))
}

বাহ্যিক নির্ভরতা নেই!

$ go run uuid.go 
3ee995e3-0c96-4e30-ac1e-f7f04fd03e44

4
ডাউনভোটেড কারণ মাল্টি-প্ল্যাটফর্ম অ্যাপ্লিকেশনগুলির জন্য ব্যবহৃত প্রোগ্রামিং ভাষায় সরাসরি হোস্ট-প্ল্যাটফর্মের উপর নির্ভর করে বাহ্যিক নির্ভরতার চেয়ে খারাপ।
বিদায়

1
প্রোগ্রামিংয়ের ভাষা মাল্টিপ্লেটফর্ম হতে পারে, তবে এটি খুব সাধারণ সমাধান লিনাক্স নির্দিষ্ট যা অন্য প্ল্যাটফর্মে কখনও হবে না, সুতরাং এটি একটি বৈধ প্রতিক্রিয়া আইএমও।
টন

1

উইন্ডোজের জন্য আমি সম্প্রতি এটি করেছি:

// +build windows

package main

import (
    "syscall"
    "unsafe"
)

var (
    modrpcrt4 = syscall.NewLazyDLL("rpcrt4.dll")
    procUuidCreate = modrpcrt4.NewProc("UuidCreate")
)

const (
    RPC_S_OK = 0
)

func NewUuid() ([]byte, error) {
    var uuid [16]byte
    rc, _, e := syscall.Syscall(procUuidCreate.Addr(), 1,
             uintptr(unsafe.Pointer(&uuid[0])), 0, 0)
    if int(rc) != RPC_S_OK {
        if e != 0 {
            return nil, error(e)
        } else {
            return nil, syscall.EINVAL
        }
    }
    return uuid[:], nil
}

2
ডাউনভোটেড কারণ মাল্টি-প্ল্যাটফর্ম অ্যাপ্লিকেশনগুলির জন্য ব্যবহৃত প্রোগ্রামিং ভাষায় সরাসরি হোস্ট-প্ল্যাটফর্মের উপর নির্ভর করে বাহ্যিক নির্ভরতার চেয়ে খারাপ।
বিদায়

1
@ বাইবেই, আমি অবাক হয়েছি যে আপনি কেন এই প্রশ্নটির দেওয়া সমস্ত উত্তরগুলির মধ্যে "আরও খারাপ" (এবং কী নয়) এই সিদ্ধান্তটি নির্ধারণ করার এবং "সিস্টেমনির্ভর" যা সমস্তকে হ্রাস করবেন তার সিদ্ধান্ত নেওয়ার জন্য নিজেকে কেন একটি কর্তৃত্ব বলে মনে করছেন? এই উত্তরগুলি দেওয়া হয়েছিল) ক) সম্ভাব্য সমস্ত পছন্দগুলির দিগন্তকে প্রশস্ত করুন, এবং খ) সম্মিলিতভাবে একটি সম্পূর্ণ চিত্র উপস্থাপন করুন সুতরাং দয়া করে বাচ্চাদের "এসও খেলানো" বন্ধ করুন এবং আপনার ক্রিয়া করার আগে কিছুটা চিন্তাভাবনা করুন।
কোস্টিক্স

সংক্ষিপ্ত উত্তর. রক্ষণাবেক্ষণযোগ্য কোড লেখা। আপনার উত্তরটি অন্য প্ল্যাটফর্মে পোর্ট করা যায় না। সুতরাং ওপি যদি তাদের অ্যাপ্লিকেশনটিকে অন্য প্ল্যাটফর্মে নিয়ে যেতে পছন্দ করে তবে অ্যাপ্লিকেশনটি ভেঙে যাবে। আমি আমার লোকদের ন্যায্য অংশ নিয়েছি যারা প্ল্যাটফর্ম নির্ভর কোড লিখেছেন যেখানে এটি সম্পূর্ণ অপ্রয়োজনীয় এবং এটি আরও ঝামেলা সৃষ্টি করে তখন এটি মূল্যবান। আপনি নিজের জন্য কোড লিখবেন না। আপনি লোকেদের কোড লিখেছেন যারা চলে যাওয়ার পরে এটিকে বজায় রাখবেন। এই কারণেই এই উত্তরটি উপযুক্ত নয়। বিজ্ঞাপন হোমিনেমস অবলম্বন করার এবং আমাকে শিশুসুলভ বলার কোনও কারণ নেই।
বিদায়

1
@ বাইবায়, আমি অত্যধিক প্রতিক্রিয়া জানালাম, সুতরাং দয়া করে আমাকে আক্রমণটির জন্য ক্ষমা করুন। আমি এখনও আপনার কারণগুলির বিষয়ে নিশ্চিত নই, তবে অনুমান করা যায় যে এটি "এর সাথে একমত হতে রাজি নয়" "
kostix

1

এই লাইব্রেরিটি ইউইড জেনারেশন এবং পার্সিংয়ের জন্য আমাদের স্ট্যান্ডার্ড:

https://github.com/pborman/uuid


নোট করুন যে গুগলের নিজস্ব লাইব্রেরি ( github.com/google/uuid ) আংশিকভাবে github.com/pborman/uuid এর উপর ভিত্তি করে তৈরি হয়েছে , যা গুগলের পরিবর্তিত কিছু পরিবর্তনকে ফিরিয়ে দিয়েছে। তবে অভিযোগ করা হয়েছে, আপনি যদি এই প্রকল্পগুলির যে কোনও একটিতে অবদান রাখতে চান তবে আপনাকে একটি অবদানকারী লাইসেন্স চুক্তি (সিএলএ) স্বাক্ষর করতে হবে (বা সই করেছেন )। আপনার উত্তর যুক্ত হওয়ার পরে আগস্ট 2015-এ দৃশ্যত এটি ছিল না; @ পোবারম্যান যোগ করেছেন কেবলমাত্র 16 ফেব্রুয়ারী 2016
গুইনথ ল্লেওলিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.