2011-07-20 11 views
11

Làm cách nào để tạo một giá trị ID duy nhất có thể dễ dàng truyền qua điện thoại hoặc email, có thể dễ dàng nhớ trong khi vẫn không dễ đoán.Làm cách nào để tạo ID duy nhất thân thiện với con người bằng Python?

Tôi đang sử dụng cơ sở dữ liệu. Nhưng khi tôi đưa ID cho những người tôi không muốn nó bị ràng buộc vào một cơ sở dữ liệu. Tôi có thể làm thứ gì đó bằng ID duy nhất mà tôi đã có trong cơ sở dữ liệu nhưng không thể sử dụng trực tiếp, để tránh nó có thể đoán được.

Tôi đang sử dụng Python và đã thử sử dụng uuid, nhưng uuidquá dài để có thể đọc được bằng con người.

Có cách nào để tạo ID có thể phát âm thân thiện với con người không?

+0

Độc đáo cho cơ sở nào? Bạn có một cơ sở dữ liệu hay bạn muốn tạo một chuỗi/số ngẫu nhiên mà không có khả năng xảy ra va chạm với các giá trị sau đây? Xin vui lòng cho biết thêm về vấn đề của bạn. – schlamar

+0

@ ms4py câu hỏi đã được chỉnh sửa. – iamgopal

+0

Điều gì về 'băm (str (your_id))' – schlamar

Trả lời

0

Dưới đây là ví dụ dựa trên uuid. Điều chỉnh 1000000 để tăng hoặc giảm phạm vi id của bạn. Vì bạn đang giảm phạm vi của id, có thể bạn sẽ phải kiểm tra xem ID đã tồn tại chưa.

>>> import uuid 
>>> hash(str(uuid.uuid1())) % 1000000 
380539 
>>> hash(str(uuid.uuid1())) % 1000000 
411563 
+1

Sự ngẫu nhiên không liên quan gì đến tính độc đáo. – delnan

+1

Sử dụng một số ngẫu nhiên là hoàn toàn tương đương với việc sử dụng một băm có kích thước bằng nhau, nếu bạn không cần phải tạo lại cùng một ID sau này cho cùng một đối tượng. – agf

2

Điều gì giống như cụm từ trả tiền của Amazon? Chuyển đổi ID nhị phân thành chuỗi các từ tiếng Anh.

Nếu bạn muốn thứ gì đó có cùng phạm vi với UUID, bạn cần thể hiện 16 byte. Để giữ cho nó hợp lý, hãy hạn chế cụm từ thành 4 từ, vì vậy mỗi từ đại diện cho 4 byte, hoặc 65536 khả năng, vì vậy bạn sẽ cần một từ điển gồm 262,144 từ.

CHỈNH SỬA: Trên thực tế, những gì có thể tốt hơn là một loại câu điên khùng - nó sẽ hạn chế số từ cần thiết và có thể dễ nhớ hơn vì nó có cấu trúc ngữ pháp. Tất nhiên, điều này cần phải dài hơn:

(a/an/the/#) (adj) (danh từ) (động từ) (căng thẳng) (trạng từ) trong khi (a/an/the/#) (adj) (danh từ) (động từ) (trạng từ).

+0

Hoặc trong số 65536 từ, nếu bạn cho phép "Foo Foo Foo Foo" làm cụm từ thanh toán hợp lệ. – agf

+0

Chỉnh sửa của bạn quá phức tạp. Chỉ cần tải một từ điển và sử dụng 'remember_id = '' .join (từ điển [random.randint (0, 65535)] cho Null trong phạm vi (4))' là tốt hơn. – agf

11

Điều bạn muốn làm là ghép các âm tiết lại với nhau để tạo ra các từ giả phát âm. Bạn có thể tạo âm tiết bằng bất kỳ ngôn ngữ nào bạn muốn tạo thành các từ có thể phát âm và truyền đạt nhưng thực sự không có ý nghĩa gì cả.

Here is an article about how one person created human readable UIDs for speaking them phonetically and some of the pitfalls.

Đọc liên kết ở trên cho một số những cạm bẫy, bạn nên cân nhắc khi tham gia một cách tiếp cận như thế này.

Bạn chỉ có thể sử dụng một chuỗi ký tự chữ cái nhưng hiển thị chúng dưới dạng NATO phonetic alphabet thay vì chỉ là bảng chữ cái.

0

Chắc chắn, nhưng nó đòi hỏi một vài hạn chế hơn trên không gian vấn đề của bạn, cụ thể là:

  1. Chỉ có một điều tạo ID độc đáo
  2. mục của bạn có một số khái niệm về một danh hiệu
  3. Bạn có thể kiên trì một danh sách các chuỗi

Sau đó, bạn muốn làm điều gì đó như:

_UID_INTERNALS = set() 

def getID(obj): 
    if hasattr(obj, 'UID'): 
     return obj.UID 
    title = obj.title.encode("ascii", errors="ignore") 
    title = title.lower() 
    title = "-".join(title.split()) 
    if not title: 
     title = "unnamed-object" 
    UID = title 
    num = 1 
    while UID in _UID_INTERNALS: 
     UID = title + str(num) 
     num += 1 
    _UID_INTERNALS.add(UID) 
    obj.UID = UID 
    return UID 
+0

Như trên, có gì sai với mã này? Nó hoạt động hoàn toàn đầy đủ và giải quyết câu hỏi của bạn như đã nêu. – MatthewWilkes

3

Đối với các email, những gì tôi sử dụng là:

from base64 import b64encode 
from os import urandom 
key = b64encode(urandom(9)) 

Bạn có thể tăng/giảm độ dài bằng cách thay đổi số điện thoại. Đôi khi bạn sẽ nhận được + và/ký tự và bạn có thể loại bỏ chúng ra nếu bạn muốn.

Edit: Vì bạn cũng muốn vượt qua chúng qua điện thoại có thể b32encode(urandom(5)) sẽ là một lựa chọn tốt hơn vì nó sẽ không cung cấp cho bạn bất kỳ chữ thường hoặc các ký tự đặc biệt.

+1

Bạn có thể giải thích tại sao đây là một ý tưởng tồi, vì tôi sử dụng bản thân mình? – nima