สร้าง GUID ใน Java


377

อะไรคือวิธีที่ดีที่สุดในการสร้าง GUID ใน Java


3
คำถามที่stackoverflow.com/questions/325443/generate-uuid-in-javaเป็นเรื่องเกี่ยวกับการชนกันของ GUID มากขึ้นแล้วว่าสิ่งที่เทียบเท่าของ GUID นั้นอยู่ในกองเทคโนโลยี Java ซึ่งเป็นสิ่งที่ (ฉันคิดว่า) เป็นมากกว่า ความสำคัญของคำถามนี้
Jon Adams

คำตอบ:


347

ดูที่คลาส UUID ที่มาพร้อมกับ Java 5 และใหม่กว่า

ตัวอย่างเช่น:

  • หากคุณต้องการสุ่ม UUID คุณสามารถใช้วิธีrandomUUID
  • หากคุณต้องการ UUID ที่เริ่มต้นเป็นค่าเฉพาะคุณสามารถใช้UUID ConstructorหรือวิธีfromString

7
หากคุณใส่ตัวอย่างเช่น Kaleb Brasee ทำไว้คำตอบที่ดีของคุณจะดียิ่งขึ้น
Zero3

ทำงานใน AndroidStudio 2.3 และ API ระดับ 21 ขึ้นไปอย่างน้อย อาจกลับมาอีกด้วย
raddevus

5
TL; DR ... "UUID uuid = UUID.randomUUID ();"
Aviram Fireberger

419

java.util.UUID.randomUUID();


2
มันจะกลับมาซ้ำ? เพราะ Guid จะไม่ทำซ้ำ
angel

4
@angel ใช่มันเป็นไปได้ในทางทฤษฎีสำหรับUUID.randomUUIDวิธีการที่จะกลับมาซ้ำ แต่นี้ไม่ได้ทั้งหมดเป็นความกังวลที่มีเหตุผล การใช้งาน Oracle / OpenJDK ใช้ตัวสร้างตัวเลขสุ่มแบบเข้ารหัสลับที่แข็งแกร่ง เมื่อพิจารณาแล้วและกำหนดช่วงทางดาราศาสตร์ที่กำหนดโดยบิตจำนวนมากใน UUID คุณสามารถสร้างค่าดังกล่าวได้หลายล้านค่าในแอปของคุณและยังคงหลับสบาย การใช้หนึ่งในตัวแปรอื่น ๆ ช่วยลดความเป็นไปได้ของการชนได้ใกล้เคียงกับศูนย์มากขึ้นเนื่องจากการใช้ "space and time", [1] ที่อยู่ MAC หรือชื่อและ [2] วันที่ - เวลาปัจจุบันเป็นข้อ จำกัด
Basil Bourque

@RenniePet Eh ถ้าคุณหวาดระแวงนั้นและคุณสามารถเข้าถึงรายการ ID ที่ใช้ไปแล้วเมื่อสร้างขึ้นมาใหม่คุณเพียงแค่สร้างรหัสใหม่ในwhileจนกว่าคุณจะได้รับที่ไม่ได้อยู่ในรายการของคุณ: p
Nyerguds

2
ตัวสร้างตัวเลขสุ่มของ crypto ของออราเคิลนั้นโดยทั่วไปแล้วจะเป็น PRNG ที่มีการสุ่มข้อมูล โดยทั่วไปจะได้รับเมล็ดสุ่มโดยใช้แหล่งที่มาของ "เอนโทรปี" โดยระบบปฏิบัติการ หากคุณสามารถลดหรือประนีประนอมแหล่งที่มานั้นความน่าจะเป็นของเครื่องกำเนิดตัวเลขสุ่มเข้ารหัสลับที่ผลิตหมายเลขเดียวกันจะเพิ่มขึ้น นอกจากนี้ยังเป็นที่น่าสังเกตว่าในบางแพลตฟอร์ม (เช่นเวอร์ชวลไลเซชัน) ระบบปฏิบัติการอาจหมดพลังงานจากเอนโทรปี มี "แฮ็กหลบ" เพื่อแก้ไขปัญหานี้ แต่พวกเขานำมาซึ่งการย่อยสลายคุณภาพของเอนโทรปี
Stephen C

นี่ไม่ใช่แค่ความกังวลด้านวิชาการ ฉันได้เห็นการ ( ที่ไม่ได้ยืนยัน !! ) อ้างว่าคนที่ไม่เกิดปัญหาขึ้นกับ UUIDs สุ่มตามไม่เป็นที่ไม่ซ้ำกัน
Stephen C

32

ขึ้นอยู่กับUUID ที่คุณต้องการ

  • UUIDคลาสJava มาตรฐานสร้างUUIDs เวอร์ชัน 4 (สุ่ม) ( อัปเดต - เวอร์ชัน 3 (ชื่อ) สามารถสร้าง UUID ได้) นอกจากนี้ยังสามารถจัดการตัวแปรอื่น ๆ ได้แม้ว่าจะไม่สามารถสร้างได้ (ในกรณีนี้ "จับ" หมายถึงการสร้างUUIDอินสแตนซ์จากlong, byte[]หรือStringการแสดงและให้ accessors เหมาะสมบาง.)

  • การนำJava UUID Generator (JUG)ไปใช้เพื่อสนับสนุน UUID ประเภท "ทั้ง 3 'อย่างเป็นทางการ' ตามที่กำหนดโดยRFC-4122 " ... แม้ว่า RFC จะกำหนด 4 ประเภทและกล่าวถึงประเภทที่ 5

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับประเภทและตัวแปร UUID มีบทสรุปที่ดีในWikipediaและรายละเอียดเต็มไปด้วยเลือดอยู่ในRFC 4122และข้อกำหนดอื่น ๆ


1
ไม่จริงอย่างสมบูรณ์มันยังสามารถสร้าง UUIDs แบบอิงชื่อ (รุ่น 3) ด้วยUUID.nameUUIDFromBytes(byte[] name)
DennisK

ฉันยืนแก้ไขแล้ว ฉันพึ่งพาคำอธิบาย javadoc ซึ่งระบุว่า"โรงงานคงที่เพื่อดึง UUID ประเภท 3 (ตามชื่อ) UUID ตามอาร์เรย์ไบต์ที่ระบุ"
Stephen C

ฉันไม่คิดว่าโพสต์นั้นถูกต้อง เอกสาร UUID Javaรัฐสร้างสร้างชนิดที่ 2 ตัวแปรไม่สุ่ม สำหรับประเภทที่ 3 public static UUID nameUUIDFromBytes(byte[] name)การใช้งาน สำหรับประเภท 4 public static UUID randomUUID()การใช้งาน Type 1 ไม่สามารถใช้ได้กับคลาส JDK
slartibartfast

ไม่ฉันคิดว่าฉันเข้าใจถูกแล้ว สถานะ javadocs: "แม้ว่าตัวสร้างอนุญาตให้สร้างตัวแปรของ UUID ใด ๆ (อธิบายไว้ด้านล่าง)" และ 4 สายพันธุ์มีการระบุไว้ด้านล่างรวมถึงประเภท 1 แน่นอนอ่าน javadoc สำหรับclockSequence()
Stephen C

27

เพียงเพื่อขยายคำตอบของ Mark Byers ด้วยตัวอย่าง:

import java.util.UUID;

public class RandomStringUUID {
    public static void main(String[] args) {
        UUID uuid = UUID.randomUUID();
        System.out.println("UUID=" + uuid.toString() );
    }
}

7

คำตอบอื่น ๆ ที่ถูกต้องโดยเฉพาะอย่างยิ่งนี้โดยสตีเฟ่นซี

ถึงภายนอก Java

การสร้างค่าUUIDภายใน Java ถูก จำกัด ไว้ที่เวอร์ชัน 4 (สุ่ม)เนื่องจากปัญหาด้านความปลอดภัย

หากคุณต้องการรุ่นอื่นของ UUIDs หนึ่งถนนคือให้แอป Java ของคุณเข้าถึงภายนอกJVMเพื่อสร้าง UUIDs โดยโทรไปที่:

  • อรรถประโยชน์บรรทัดคำสั่งที่
    มาพร้อมกับระบบปฏิบัติการเกือบทุกระบบ
    ตัวอย่างเช่นuuidgenพบใน Mac OS X, BSD และ Linux
  • เซิร์ฟเวอร์ฐานข้อมูล
    ใช้JDBCเพื่อดึงข้อมูล UUID ที่สร้างขึ้นบนเซิร์ฟเวอร์ฐานข้อมูล
    ยกตัวอย่างเช่นการuuid-osspขยายมักจะมาพร้อมกับPostgres ส่วนขยายนั้นสามารถสร้างค่าเวอร์ชัน 1, 3 และ 4 และยังมีรูปแบบที่แตกต่างกันสองแบบ:
    • uuid_generate_v1mc() - สร้าง UUID รุ่นที่ 1 แต่ใช้ที่อยู่ MAC แบบหลายผู้รับแบบสุ่มแทนที่อยู่ MAC ที่แท้จริงของคอมพิวเตอร์
    • uuid_generate_v5(namespace uuid, name text) - สร้าง UUID รุ่น 5 ซึ่งทำงานเหมือน UUID รุ่น 3 ยกเว้น SHA-1 จะใช้เป็นวิธีการแปลงแป้นพิมพ์
  • บริการเว็บ
    ตัวอย่างเช่นUUID Generatorสร้างรุ่นที่ 1 และ 3 รวมทั้งค่าศูนย์และGUID

3
ฉันมีปัญหาบางอย่างกับคำตอบของคุณ: อันดับแรกมันแสดงให้เห็นแล้วว่าผิดที่คุณจะได้รับ V4 จากไลบรารี่มาตรฐานของจาวาเท่านั้น (V3 ก็เป็นไปได้เช่นกัน) ประการที่สองคุณทำให้ดูเหมือนว่าไม่มีตัวเลือกภายใน Java นอกเหนือจากห้องสมุดมาตรฐานพร้อมด้วยมือหยัก "เนื่องจากความกังวลด้านความปลอดภัย" และสุดท้ายก็เป็นเพียงแค่การไม่มีประสิทธิภาพ (การเขียนโปรแกรมและ / หรือประสิทธิภาพการทำงานที่ชาญฉลาด) เพื่อเริ่มต้นขึ้นอยู่กับแหล่งข้อมูลภายนอกเมื่อมีวิธีการมากมายที่จะทำภายใน Java (เว้นแต่ว่าคุณต้องการมันในที่แน่นอนเช่นเป็นส่วนหนึ่งของการสร้าง บันทึกในเซิร์ฟเวอร์ SQL)
DennisK
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.