2010-09-05 41 views
11

thể trùng lặp:
Reliable way of generating unique hardware IDTạo ID duy nhất cho một máy tính cụ thể

Am cố gắng để tạo ra một ID đó sẽ là duy nhất cho một máy tính cụ thể. ID sẽ không được tạo ngẫu nhiên. Nó sẽ được tính dựa trên, sao cho ID được tạo cho máy tính A sẽ được cố định và duy nhất cho máy tính A. Mỗi khi chương trình được thực thi trên máy tính A, nó sẽ tiếp tục tạo cùng một ID và khi được thực thi trên máy tính khác, nó sẽ tạo một ID khác duy nhất cho máy tính đó. Điều này là để đảm bảo rằng hai máy tính không có cùng một ID.

Thách thức của tôi: Để chương trình của tôi có thể tạo ID duy nhất cho máy tính, cần thực hiện phép tính dựa trên hạt giống duy nhất cho máy tính đang chạy nó.

Câu hỏi của tôi: Làm cách nào để tôi có thể sử dụng giá trị làm hạt giống trong chương trình tạo ID?

Có thể lấy giá trị từ phần cứng của máy tính (ví dụ: bo mạch chủ) duy nhất cho máy tính đó không? Bằng cách đó, giá trị có nhiều khả năng không thay đổi miễn là bo mạch chủ của máy tính không được thay thế.

+2

Nó không thể được thực hiện theo bất kỳ cách nào có ý nghĩa mà không thể bị lật đổ bởi một chủ sở hữu máy tính đủ năng động. Nếu bạn đang cố gắng tìm một cách để các thiết bị phân biệt một cách độc đáo với những người khác mà chúng được kết nối với, đó là một câu hỏi khác mà có những giải pháp hợp tác. – msw

+2

Điều gì về các máy ảo không có thành phần vật lý? Có phải 2 máy ảo cùng một máy nếu chúng có cùng dữ liệu cấu hình không? – emory

+0

Cảm ơn rất nhiều vì những người trả lời nhanh chóng. Có thể lấy ID của bộ xử lý chính của máy tính không. Tôi thấy một cái gì đó tương tự như một nơi nào đó trên internet, nhưng nó trong C#. Tôi tự hỏi liệu nó có thể đạt được điều tương tự trong Java hay không. –

Trả lời

10

Địa chỉ MAC? Thats (cho mục đích thực tế) unique to every NIC để đảm bảo khả năng tái sản xuất ngay cả khi người dùng khởi động kép. Chắc chắn có những trường hợp hiếm hoi của những người giao dịch thẻ, nhưng cùng với các số liệu khác (không chỉ sử dụng thẻ này vì thẻ mạng có thể được thay đổi), vẫn có thể.

Làm cách nào bạn nhận được?

public static byte[] getMACAddress() throws SocketException, UnknownHostException { 
    InetAddress address = InetAddress.getLocalHost(); 
    NetworkInterface networkInterface = NetworkInterface.getByInetAddress(address); 

    return networkInterface.getHardwareAddress(); 
} 

Nếu bạn muốn có một chuỗi đại diện, làm điều này

for (int byteIndex = 0; byteIndex < macAddress.length; byteIndex++) { 
    System.out.format("%02X%s", macAddress[byteIndex], (byteIndex < macAddress.length - 1) ? "-" : ""); 
} 

(nhờ http://www.kodejava.org/examples/250.html)

Lưu ý: Như đã đề cập trong các ý kiến, địa chỉ Mac có thể bị giả mạo. Nhưng bạn nói về một phần nhỏ dân số làm điều này, và trừ khi bạn sử dụng nó cho những thứ chống sao chép trái phép, đủ độc đáo của nó.

+0

Trên cùng một trang Wikipedia bạn liên kết đến là một liên kết đến http://en.wikibooks.org/wiki/Changing_Your_MAC_Address địa chỉ MAC là ** không ** duy nhất. – msw

+0

Không hoàn toàn độc đáo và không có bảo đảm, trên thực tế, địa chỉ được biết là được sử dụng lại, nhưng * gần như * duy nhất và * gần như * được bảo đảm, chắc chắn ... – DigitalRoss

+0

@msw @DigitalRoss Phần cứng có thể bị xóa, phần cứng có thể được thay đổi , phần cứng có thể bị giả mạo, v.v. Không có sự bảo đảm duy nhất. Địa chỉ máy Mac là duy nhất đủ. Xem cập nhật – TheLQ

1

Cách dễ dàng để thực hiện việc này là đọc phần cứng ethernet hoặc địa chỉ "mac".

http://download.oracle.com/javase/6/docs/api/java/net/NetworkInterface.html#getHardwareAddress()

địa chỉ Mac không phải là khá độc đáo như mọi người nghĩ, khi họ làm được tái sử dụng trong thời gian tới. Nhưng tỷ lệ cược của một ứng dụng hoặc mạng có hai ứng dụng hoặc mạng giống nhau khá thấp.

0

Địa chỉ MAC là duy nhất đủ cho những gì bạn. Xem http://en.wikipedia.org/wiki/MAC_address

Bạn không chỉ định ngôn ngữ bạn đang sử dụng. Nó có thể dễ dàng hơn trong một số ngôn ngữ hơn những ngôn ngữ khác. Đây là cách thực hiện trong Java http://www.kodejava.org/examples/250.html. Google xung quanh cho ngôn ngữ của bạn.

+0

Một cách ngẫu nhiên, các thẻ bài * làm * chỉ định ngôn ngữ anh ấy đang sử dụng. Và ba người đưa ra câu trả lời này trước khi tôi gõ xong ... Tôi nghĩ đó là một kỷ lục mới. :) –

0

Tùy chọn tốt nhất của bạn là căn cứ vào ID trên địa chỉ MAC của bộ điều hợp mạng chính.

Điều này có khả năng có khả năng thay đổi vào một thời điểm nào đó, nhưng cũng vậy là bất kỳ thành phần cứng nào.

HƯỚNG DẪN FYI được tính bằng địa chỉ MAC.

+0

Ha ha ... 4 cho giá của một. – ocodo

0

Bạn có truy cập vào bất kỳ thông tin nào được mô tả trong bài viết này không? Windows chỉ

http://msdn.microsoft.com/en-us/library/aa394587.aspx

số Serial, thẻ tài sản

+0

Số sê-ri có liên quan đến Windows hoặc số sê-ri của nhà sản xuất thực tế không? – avacariu

+0

Và không phải là nền tảng ... – TheLQ

+0

Nó liên quan đến bao vây vật lý. Tôi đã chỉ ra đó là một giải pháp chỉ có Windows, nếu nó hoạt động. – James

0

Một tùy chọn khác IFF bạn đang sử dụng chip intel là bộ vi xử lý số serial, giả sử bạn có thể đảm bảo các tính năng được kích hoạt. Xem Intel Serial # Note để biết thêm thông tin

+0

Ông đang sử dụng Java, không có khái niệm về một bộ vi xử lý :) –

7

Win32 tạo SID máy tính, được cho là duy nhất cho mỗi lần cài đặt bạn có thể nhận được qua WMI hoặc Active Directory, nhưng đó là nền tảng khá cụ thể. Bạn cũng có thể sử dụng địa chỉ MAC, như mọi người khác đã đề cập, chỉ cần đảm bảo rằng nó là một adapter mạng vật lý, như các adapter ảo có xu hướng chia sẻ cùng một địa chỉ MAC trên các máy tính. Tuy nhiên, UUID (hoặc GUID's) là số 128 bit được cho là đảm bảo duy nhất và được tạo ra nhằm mục đích giải quyết vấn đề tạo ra mã định danh duy nhất trên nhiều máy ngẫu nhiên. Theo Wikipedia:

Để đưa những con số này vào quan điểm, rủi ro hàng năm của một người bị trúng một thiên thạch được ước tính là một cơ hội trong 17 tỷ đồng, [25] có nghĩa là xác suất được khoảng ,00000000006 (6 × 10−11), tương đương với tỷ lệ cược tạo một vài chục nghìn tỷ của UUID trong một năm và có một số trùng lặp. Nói cách khác, chỉ sau khi tạo 1 tỷ UUID mỗi giây trong 100 năm tiếp theo, xác suất chỉ tạo một trùng lặp sẽ là khoảng 50%. Xác suất của một bản sao sẽ là khoảng 50% nếu mọi người trên trái đất sở hữu 600 triệu UUID.

Tổng số kết hợp có thể là 2^128 (hoặc 3 x 10^38), vì vậy tôi có xu hướng tin tưởng. Ngoài ra, hầu hết các trình tạo UUID hiện đại không sử dụng thuật toán V1 nữa (tức là dựa trên địa chỉ MAC), vì nó được coi là một vấn đề bảo mật do thực tế là người ta có thể biết khi nào GUID được tạo và người tạo ra nó . Trong thế giới Win32, một bản vá bảo mật được thay thế bằng Win2K hoặc NT 4 để sử dụng phiên bản V4 của thuật toán, dựa trên một số giả ngẫu nhiên thay vì MAC và JVM luôn sử dụng phiên bản V3/V4.

EDIT: Phương pháp được sử dụng để tạo UUID trong Java là thông qua lớp java.util.UUID.

+0

Vì vậy, sẽ làm 'UUID.fromString (" một số chuỗi ");' tạo ra cùng một UUID chính xác trên một số trường hợp VM? Điều gì về trên cùng một máy tính nhưng trên một hệ điều hành khác nhau? – TheLQ

+0

@TheLQ: "một số chuỗi" không thể được phân tích cú pháp :) Bạn đã đọc http://www.ietf.org/rfc/rfc4122.txt chưa? – extraneon

+0

@TheLQ: Cú pháp sẽ là 'UUID.fromString (" {00000000-0000-0000-0000-000000000000} ")', và sẽ được sử dụng để chuyển đổi một biểu diễn chuỗi hiện có của UUID thành một lớp UUID, vì vậy có, bạn sẽ nhận được cùng một UUID mỗi lần cho cùng một giá trị đầu vào (giả sử bạn đã mã hóa cứng chuỗi đầu vào). Để tạo một UUID mới, bạn sẽ sử dụng 'UUID.randomUUID()', nó sẽ là duy nhất trên một số cá thể VM. – Javert93

Các vấn đề liên quan