Khi nào bạn sẽ sử dụng ID chuỗi dài thay vì số nguyên đơn giản? [đóng cửa]


54

Tôi muốn sử dụng Youtube làm ví dụ: họ sử dụng ID ở dạng PEckzwggd78.

Tại sao họ không sử dụng số nguyên đơn giản?

Hoặc imgur.com - họ cũng sử dụng ID như 9b6tMZScho hình ảnh và phòng trưng bày. Không phải số nguyên tuần tự.

  • Tại sao họ không sử dụng số nguyên (đặc biệt là tuần tự)?

  • Trong trường hợp nào là một quyết định khôn ngoan khi sử dụng ID chuỗi như vậy thay vì số nguyên?


47
Điều gì khiến bạn tin rằng ID không chỉ là số nguyên đơn giản? Tôi biết rất nhiều dịch vụ web sử dụng số nguyên trong DB nhưng hiển thị chúng trong một số mã hóa base64 để URL trông đẹp hơn. Điều thú vị là, các ID youtube gần như ánh xạ tới các số nguyên 64 bit.
Josef

2
@rwong Nhưng câu hỏi của OP là tại sao họ không sử dụng ID số và câu trả lời có thể là: Họ sử dụng ID số, ​​họ chỉ hiển thị chúng trong base64 thay vì base10 hoặc base2. Mặc dù vậy, tôi không biết chắc chắn điều đó, vì vậy tôi đang hỏi OP điều gì đặc biệt khiến họ nghĩ rằng ID không phải là số nguyên 64 bit đơn giản trong cơ sở64.
Josef


3
Điều đó không giống như thế này .
the_lotus

Câu trả lời:


101

Youtube không thể sử dụng ID liên tục vì hai lý do:

  1. Cơ sở dữ liệu của nó gần như chắc chắn được phân phối, làm cho việc đánh số tuần tự trở nên phức tạp.

  2. Nó có tùy chọn bảo mật "Video không được liệt kê": những video không hiển thị trong kết quả tìm kiếm, nhưng có sẵn nếu bạn biết ID.

Do đó, ID video phải hợp lý ngẫu nhiên và không thể đoán trước. Cho dù ID chỉ được biểu thị bằng các chữ số hoặc bằng cách kết hợp các chữ cái và chữ số, đều không liên quan: có một ánh xạ tầm thường từ biểu diễn này sang biểu diễn khác.


11
Id số không cần phải tuần tự
Sopel

28
@Sopel Tôi nghĩ rằng quan điểm của IMil là Youtube cần tạo ra các ID thưa thớt. Nói cách khác, nếu ước tính rằng bạn sẽ chỉ cần lưu trữ 2^40các mục, trong một số kiến ​​trúc, có những lý do chính đáng để chọn một không gian 2^80hoặc 2^120bit. Ví dụ về các lý do là: giảm va chạm mà không kiểm tra kỹ thuật va chạm; sử dụng độ thưa của các phím như một phần của việc tạo bí mật khó tìm ("video chưa được liệt kê"), v.v.
rwong

13
@Sopel câu hỏi là "Tại sao họ không sử dụng số nguyên (đặc biệt là số nguyên)?" Tôi giải thích rằng: 1) ID tuần tự là không mong muốn; 2) số nguyên và chuỗi về cơ bản là giống nhau
IMil

3
Mệnh đề "do đó" không tuân theo logic nhưng hai điểm được đánh số là đúng. Như một ví dụ về lý do tại sao tính ngẫu nhiên không phải là một hệ quả cần thiết: đánh số tuần tự với các khoảng trống thống nhất sẽ hoạt động để cung cấp các id duy nhất trong nhiều cơ sở dữ liệu độc lập sao cho kết quả có thể được kết hợp trong một kho dữ liệu - đây là một hình thức che chở. Đó là, giả sử bạn dự đoán không quá 10000 cơ sở dữ liệu khu vực (có lẽ bạn chỉ có 10 cơ sở ngay bây giờ nên 10000 là đủ). Sau đó, mỗi db có thể có một cột nhận dạng đếm bằng 10000 với 4 chữ số cuối cùng duy nhất, sẽ không có xung đột khi hợp nhất.
davidbak

2
@davidbak yêu cầu về tính ngẫu nhiên theo sau (2). Tính duy nhất thực sự có thể thu được bằng cách gán các phạm vi không chồng lấp cho các trường hợp cơ sở dữ liệu khác nhau, nhưng điều này sẽ khiến ID có thể dự đoán được.
IMil

75
  • Về hình thức các ID: Họ đang sử dụng Base64 (sử dụng các nhân vật a- z, A- Z, 0- 9, -_). Điều này cho phép họ có 6 bit thông tin cho mỗi ký tự. YouTube sử dụng ID video 11 ký tự, có nghĩa là họ có thể tạo 2 6 * 11 hoặc hơn 7 * 10 19 ID. Như Tom Scott nói , điều đó "đủ để mỗi người trên hành tinh Trái đất tải lên video mỗi phút trong khoảng 18.000 năm." Base64 cũng dễ dàng làm việc với, bởi vì 64 là lũy thừa 2, có nghĩa là mọi ký tự đại diện cho một số bit chính xác. Chúng tôi sử dụng thập lục phân (cơ sở 16) cho cùng một lý do.

  • Về bản chất không tuần tự của ID: điều đó có nghĩa là họ không cần bộ đếm đồng bộ giữa tất cả các máy chủ gán ID cho video. Họ chỉ có thể tạo một số ngẫu nhiên, kiểm tra xem nó đã được sử dụng chưa và đi từ đó. Họ thậm chí có thể chỉ định cho mỗi máy chủ một khối ID để chọn và loại bỏ việc kiểm tra trùng lặp. Tôi không biết nếu họ làm điều đó, nhưng họ có thể.

  • Một lý do khác cho các ID không tuần tự là vì đó là những gì làm cho các video "không niêm yết" hoạt động. Đây là những video sẽ không hiển thị trong kết quả tìm kiếm hoặc dưới dạng đề xuất, nhưng có thể truy cập được nếu bạn có liên kết. Nếu bạn đang sử dụng tính năng đếm liên tiếp, bạn chỉ có thể truy cập video, tăng ID lên một và ý tưởng về các video chưa được liệt kê sẽ bị phá vỡ.

  • ID không tuần tự cũng giúp ẩn thông tin khỏi các đối thủ cạnh tranh, chẳng hạn như tổng số lượng video hoặc số lượng video được tải lên trên mỗi khung thời gian.

Tôi rất có thể giới thiệu video của Tom Scott . Thông tin của anh ấy hầu như luôn luôn thú vị và chính xác.


6
Chúng ta cũng chỉ ra rằng 11 ký tự của mã hóa base64 lưu trữ 66 bit thông tin, có nghĩa là chúng có thể dễ dàng ánh xạ một số nguyên 64 bit thành một chuỗi như vậy. Tức là trong nội bộ, dù sao họ cũng có thể sử dụng int 64 bit (nhưng không cần phải làm như vậy).
Bernhard Hiller

1
Để so sánh, biểu diễn thập phân thông thường có thể cần tới 20 ký tự, lãng phí trên 9 ký tự so với Base64.
dan04

Video Tom Scott giải thích điều này một cách hoàn hảo.
AGB

13
  • Các số nguyên không chia tỷ lệ tốt, số nguyên không dấu 32 bit "bình thường" sẽ chỉ đạt tối đa hơn 4 tỷ.

  • Họ có thể không muốn bạn biết họ có bao nhiêu mặt hàng trực tuyến hoặc theo dõi tốc độ họ đang tăng.

  • Chữ cái có thể chứa nhiều thông tin hơn chữ số, bạn cần ít chữ cái hơn để thể hiện cùng một "số". Đối với một cơ sở dữ liệu chỉ mục lớn, điều này có thể thêm lên.


7
1) người ta có thể sử dụng int 64
Rakori

4
2) tại sao? ........... tất cả họ đều công khai. những người không công khai - không thể truy cập. đó là
Rakori

3
3) bạn có thể xây dựng? thể hiện thông tin gì?
Rakori

2
Đối với 1: tương tự với int32 và int64. Trong khi int64 có khả năng lớn hơn, nó có thể không đủ lớn.
Nepho

3
Trong cơ sở dữ liệu, bạn sẽ lưu trữ một số dưới dạng số. Vì vậy, một int 32 bit sẽ mất 32 bit. Văn bản sẽ có mật độ ít hơn (văn bản nghèo hơn bao nhiêu sẽ phụ thuộc vào mã hóa)
Taemyr

8

1) Tại sao một số trang web sử dụng chữ cái trong ID của họ? Họ có dây không?

Chúng tôi không biết nếu các trang web đó lưu trữ ID trong cơ sở dữ liệu của họ dưới dạng chuỗi. Số và chuỗi thực sự giống nhau cho máy tính. Một chuỗi chỉ là một số, chỉ được hiển thị với một cơ sở khác. 'A' = 0x41 = 65 = 0b1000001, với máy tính, tất cả đều giống nhau. Nhưng nếu bạn hiển thị nó, cơ sở càng lớn, biểu diễn càng ngắn và URL ngắn sẽ dễ đọc và chia sẻ hơn cho con người. Các trang web như YouTube và Imgur sử dụng cơ sở 62 (chữ cái, chữ hoa và chữ thường, cộng với chữ số) hoặc lớn hơn (thêm dấu gạch ngang hoặc các ký tự URL hợp lệ khác), tương đối ngắn cho số lớn. Những gì bạn muốn sử dụng, youtu.be/23489234892348234933hoặc youtu.be/B9k6KMrv8vh?

2) Tại sao ID không tuần tự được sử dụng?

Câu trả lời của IMil giải thích về nó:

Youtube không thể sử dụng ID liên tục vì hai lý do:

  • Cơ sở dữ liệu của nó gần như chắc chắn được phân phối, làm cho việc đánh số tuần tự trở nên phức tạp.

  • Nó có tùy chọn bảo mật "Video không được liệt kê": những video không hiển thị trong kết quả tìm kiếm, nhưng có sẵn nếu bạn biết ID.

Những điều này cũng giải thích lý do tại sao ID quá lớn: (YouTube không lưu trữ 23.489.234.892.348.234.933 video khác nhau, rõ ràng)

  • Khi tạo ID, đó là một vấn đề nếu bạn vô tình tạo cùng một ID hai lần, vì vậy bạn cần một không gian ID lớn để ngăn chặn sự cố sinh nhật

  • Mọi người chỉ có thể đoán URL của các video chưa được liệt kê nếu cơ hội của bất kỳ ID hợp lệ nào được sử dụng cho video không phải là rất nhỏ.


3
> "YouTube không lưu trữ 23.489.234.892.348.234.933 video khác nhau, rõ ràng" Tôi không chắc chắn điều này có rõ ràng hay không;)
unperson325680

People can just guess the URL of unlisted videos if the chance of any given valid ID being used for a video isn't very, very small.- làm thế nào để bạn biết nếu một video không được liệt kê không thể truy cập được cho mọi người ngoại trừ tác giả của nó? ngay cả khi ai đó đã đoán ID của nó
Rakori


2
@progo Ý tôi là nếu mỗi người trên thế giới trung bình đã tải lên 3,3 tỷ video lên YouTube ...;)
Jasmijn

5

Tại sao không chỉ là số nguyên, đặc biệt là tuần tự? Và khi nào, trong trường hợp nào thì đó là một quyết định khôn ngoan đối với ID chuỗi như vậy thay vì số nguyên?

  • Không gian UTF-8 tốt hơn - khi bạn biến một số thành một chuỗi, bạn nhận được tối đa 10 kết hợp cho mỗi ký tự (0-9), nhưng khi bạn cho phép bất kỳ ký tự số alpha nào, bạn nhận được 62 kết hợp cho mỗi ký tự (az, AZ, 0-9 ), do đó, bằng cách sử dụng các chuỗi ký tự chữ và số, bạn có thể tạo ra các url ngắn hơn so với khi bạn sử dụng các chuỗi số. Điều này rất quan trọng đối với các trang web nơi người dùng đang chia sẻ các url - như Youtube và Imgur.
  • Số nguyên tuần tự khó sản xuất hơn. Để tạo số nguyên tăng tuần tự, bạn phải có một luồng tạo số hoặc phối hợp nhiều máy chủ trong hệ thống phân tán và khi bạn chạy một ứng dụng âm lượng lớn như Youtube hoặc Imgur không có quy mô độc đáo như một chuỗi được tạo ngẫu nhiên (không nói rằng họ đang tạo ngẫu nhiên)

Bên cạnh đó, không nhất thiết trường hợp biểu diễn bên trong một chuỗi. Họ rất có thể đang mã hóa một mã định danh số dưới dạng một chuỗi ký tự chữ và số cho url ngắn hơn.


1
2) trong trường hợp ID chuỗi, nhưng bạn sẽ cần xác minh rằng ID chuỗi đã được tạo trước khi chèn bản ghi mới vào db. Vậy thì có gì khác với ID int?
Rakori

@Rakorin Ngay cả khi sử dụng thứ gì đó đơn giản như UUIDv4, cơ hội va chạm là rất nhỏ. Sử dụng đủ ngẫu nhiên và cơ hội là không tồn tại, do đó, sự trùng lặp không thực sự cần phải được xác nhận.
Andy

1
@davidpacker và nó khác với việc tạo ra một số nguyên dài hơn như thế nào?
Sốt

@Sopel Như Samuel đã chỉ ra, các số nguyên sẽ chiếm nhiều không gian hơn, tức là dài hơn chuỗi. Mặt khác, thực sự không có bất kỳ sự khác biệt.
Andy

1
@davidpacker chỉ khi được in
Sopel

2

Như bạn đã chỉ ra rằng nó có thể dễ dàng sử dụng một ID duy nhất chỉ sử dụng số bởi vì tất cả mọi thứ dưới mui xe là chỉ 01và bạn có thể mở rộng số lượng để chính xác hơn sẽ lên đến 128 bit trở lên.

Tôi nghĩ lý do chính là, giả sử một số phạm vi cố định tùy ý như uint32(chỉ vì một ví dụ), nếu bạn sử dụng các chữ cái, bạn có thể có tổng số ID ngắn hơn.

Tôi tưởng tượng rằng đó là một lý do thẩm mỹ cho URL. Thay vì có 4,129,873,773những bức thư thì nó ngắn hơn nhiều Fu837t(chỉ là hư cấu do tôi tạo ra). Một người dùng thậm chí có thể nhớ URL để đưa nó cho bạn bè. Các nền tảng như Youtube thường có UUID dài hơn 32 bit vì chúng sẽ hết dung lượng nhanh chóng.


3
Điều này tôi nghĩ là câu trả lời. Sử dụng chuỗi không hiệu quả hơn hoặc dễ dàng hơn để duy trì tính duy nhất. Lý do là nó dễ dàng hơn để thể hiện dưới dạng url
Sopel

nếu người dùng có thể nhớ Fu837t, nhưng anh ta không thể nhớ 2390?
Rakori

4
@Rakori: Fu837t sẽ so sánh với 2223955238, nên có. 2390 sẽ được mã hóa thành "Vg", vì vậy: cũng có.
Vịt Mooing

@MooingDuck, không. Làm thế nào để bạn biết thuật toán để tạo chuỗi ID đó là gì?
Rakori

3
@Rakori nó không phải là một thuật toán, nó là một mã hóa. Có các thuật toán để chuyển số giữa các bảng mã khác nhau, nhưng thuật toán nào được sử dụng không quan trọng miễn là mã hóa được xác định rõ. Mã hóa Url safe64 được biết đến và chuẩn hóa .
Josef

2

Một URL ngắn là mong muốn vì nó làm cho việc liên kết và chia sẻ đơn giản hơn (ví dụ: bạn có thể chia sẻ một liên kết trong SMS, việc nhập nhanh hơn và v.v.). Các dịch vụ như Youtube hoặc Imgurl muốn bạn chia sẻ URL một cách tình cờ, vì vậy đây là một cân nhắc quan trọng.

Sử dụng ID chữ số thay vì số có nghĩa là bạn cần ít ký tự hơn để thể hiện ID có cùng kích thước bit. Ví dụ: 6 chữ số cung cấp cho bạn một triệu id duy nhất nhưng 6 ký tự chữ và số (sử dụng bộ base64) mang lại cho bạn 68 tỷ nhận dạng duy nhất.

Đối với tất cả những gì chúng ta biết, các định danh chữ số có thể là các số liên tiếp, chỉ được mã hóa theo định dạng chữ và số như base64. Nhưng thường các dịch vụ thương mại tránh các mã tuần tự để ngăn mọi người đoán ID và để tránh tiết lộ thông tin kinh doanh như lượng khách hàng.


1

Có một số lý do tại sao bạn sẽ sử dụng id không phải là số, nhưng cũng hiểu rằng không phải tất cả các giá trị với các ký tự chữ cái đều thực sự là chuỗi. YouTube có danh tiếng về số lượng video đáng kinh ngạc, với thứ tự 300 giờ video được tải lên mỗi phút ( ref ). Các số nguyên duy nhất đại diện cho các video đó có thể khá dài, do đó, hãy sử dụng thứ gì đó như số được mã hóa URL Base64 ( ref ).

Các loại đại diện định danh:

  • Số nguyên đơn giản: (12345, 981027361382493)
  • Số nguyên cơ sở 16: 123456789abcdef - còn được gọi là Hex
  • Số nguyên cơ sở 64: 9b6tMZS
  • Chuỗi có thể đọc: 12032017-Đọc-my-awesome-article-01

Họ đều có điểm mạnh và điểm yếu. Càng nhiều ký tự độc đáo bạn có thể sử dụng cho số nhận dạng của mình, bạn càng cần ít ký tự để thể hiện một số. Số 64 cơ sở là một sự thỏa hiệp khá tốt vì có một biến thể được thiết lập hoạt động cho các URL và nén số lượng ký tự cần thiết để biểu thị số 6 đến 8 (tức là 3/4 kích thước).

Các chuỗi có thể đọc được hoạt động cho blog vì chúng có thể nâng cao khả năng tìm kiếm và việc tạo các tiêu đề độc đáo sẽ dễ dàng hơn rất nhiều khi số lượng hồ sơ ít.


1

Nội dung băm

Từ "băm" không được tìm thấy trong các câu trả lời hiện có, hay, vì vậy chúng tôi đi đây:

Thông thường, dữ liệu có thể được xác định bằng hàm băm nội dung thay vì ID nhân tạo, độc lập. Điều này đặc biệt rõ ràng trong các githệ thống như phần mềm hoặc tệp như ZFS, nơi đặc tính sử dụng băm nội dung này không chỉ giúp công cụ dễ dàng hơn (ví dụ như sao chép lại), mà còn có các thuộc tính tốt khác như bộ nhớ đệm tầm thường, lịch sử bảo mật, phát hiện mục nát bit Vân vân.

Băm thường đến dưới dạng số hex (hoặc không gian chữ thậm chí lớn hơn), vì vậy đó là lý do tại sao bạn không thấy ID số nguyên. Đơn giản không có số nguyên (trong những trường hợp đó).

Băm là tốt nếu các đối tượng dữ liệu của bạn là bất biến (như trong ZFS hoặc git); họ sẽ rất tuyệt khi lưu trữ hình ảnh, ví dụ, trên các CDN lớn. Tôi không biết những ID cụ thể đó có thực sự băm hay không, nhưng chắc chắn sẽ có ý nghĩa (và như Michael Kjorling đã nhận xét, ID ngắn có thể không băm vì lý do rõ ràng - vì so sánh, git sử dụng các giá trị SHA-1 là 20 byte hoặc 40 chữ số hex).


1
Ít nhất ID video Youtube quá ngắn để có thể băm. Nghịch lý sinh nhật được áp dụng; trong ngắn hạn, trung bình, với một không gian băm gồm n bit, bạn sẽ bắt đầu thấy các xung đột sau khi nhìn thấy các đốm màu đầu vào 2 ^ (n / 2). Với ~ 60-70 bit trong ID, đó là 30-35 bit duy nhất, hoặc một vài tỷ mục. Tôi khá chắc chắn rằng họ lưu trữ nhiều video hơn bây giờ. Và, tất nhiên, hầu hết các giá trị băm là số nguyên tốt; rằng chúng thường không được in ở dạng thập phân không ảnh hưởng đến việc chúng có phải là số nguyên hay không. Phải thừa nhận rằng, cùng một dữ liệu có thể được hiểu là dữ liệu nhị phân dấu phẩy động ...
CVn

3
@ MichaelKjorling: Chà, ID video YouTube quá ngắn để băm mật mã , nhưng có rất nhiều hàm băm có 64 bit đầu ra hoặc ít hơn - CRC-16/32/64, Java hashCode(), v.v. Tất nhiên, càng ngắn băm, càng có nhiều khả năng va chạm ngẫu nhiên.
dan04

Nếu bạn muốn mọi người nhớ URL, bạn sẽ không làm cho nó trở nên quan trọng. Và việc phải nói "trên" hoặc "thấp hơn" trước mỗi chữ cái sẽ kém hiệu quả hơn nhiều so với việc chỉ nói số.
Lenne

0

Ok, một trong những lý do là các ký tự được gửi dưới dạng ký tự chứ không phải là số nguyên. Điều này là do cách thức hoạt động của HTTP Get.

Khi bạn nói, "tại sao không sử dụng một số nguyên?" Chà, số nguyên sau đó được cắt nhỏ và mỗi chữ số được gửi dưới dạng một ký tự và dù sao bạn cũng kết thúc bằng một chuỗi ký tự. Vậy tại sao không sử dụng tất cả các tùy chọn cho một nhân vật?

Ngoài ra còn có yếu tố con người:

Lấy imgur làm ví dụ: https://imgur.com/ ***** / s6UqP

s6UqP,

Phạm vi cho mỗi ký tự là: a qua z capital, a đến z sub capital và 0 đến 9 = 26+ 26+ 10 = 62 tùy chọn cho mọi vị trí trong chuỗi. Với năm vị trí có thể kết hợp 916132832. Nếu bạn chỉ sử dụng số, bạn sẽ cần 9 chữ số.

Mọi người có thể chứa khoảng 7 đối tượng trong bộ nhớ, 9 chữ số là quá nhiều, 5 ký tự là có thể thực hiện được.

Phép thuật số 7


Nó nhớ Gfycat: họ sử dụng ba từ, hai tính từ và tên động vật. Bởi vì có nhiều khả năng ( 1502 adjetives1751 động vật ), chúng có hơn 3 tỷ kết hợp chỉ sử dụng ba đối tượng.
Gustavo Coleues
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.