- Trong các quy trình con người đọc và truyền đạt ID như báo lỗi, nhập mã giảm giá, theo dõi giao hàng, sự mơ hồ về mặt thị giác như
O/0,I/l/1/7rất dễ dẫn đến lỗi nhập liệu - Mức độ nhầm lẫn tăng lên tùy theo phông chữ và chữ viết tay; các cặp khó phân biệt như
5/S,2/Z,8/B,6/G,9/q/gxuất hiện lặp lại - Với các ID do con người trực tiếp xử lý như hỗ trợ khách hàng, ID lỗi, ID sản phẩm, việc chọn tập ký tự dễ đọc quan trọng hơn đối với chất lượng sử dụng thực tế so với việc mù quáng dùng một tập ký tự lớn
- Nếu phân biệt chữ hoa/thường, ID 5 ký tự có thể tạo
418,195,493tổ hợp, nhưng nếu không phân biệt thì giảm xuống5,153,632, nên cần đánh đổi giữa độ dài và tính an toàn - ID phân biệt chữ hoa/thường dễ tạo ngắn hơn, nhưng một số hệ thống hoặc giao thức bên thứ ba có thể hoạt động theo kiểu không phân biệt chữ hoa/thường, gây vấn đề ở bước tích hợp
Nhầm lẫn ký tự trong ID do con người đọc
- Khi viết hoặc truyền đạt ID trong các tương tác hệ thống như báo cáo lỗi, nhập mã giảm giá, theo dõi giao hàng, những nhầm lẫn ký tự có thể tránh được có thể làm hỏng trải nghiệm người dùng
- Các nhóm ký tự mơ hồ về mặt thị giác tiêu biểu như sau
O/0: với số 0 không có gạch chéo hoặc dấu chấm, chữOvà số0có thể trông giống nhauI/l/1/7: chữ hoaI, chữ thườngl, số1, số7khó phân biệt trong nhiều bản in và chữ viết tay5/S,2/Z,8/B,6/G,9/q/g: có thể bị nhầm lẫn trong một số phông chữ, phông chữ cách điệu hoặc chữ viết tay
- Chuỗi ví dụ
9qg6G8B2Z5SIl170Ođược dùng làm đối tượng so sánh trong nhiều phông chữ hệ thống như Arial, Helvetica, Courier, Times, Verdana, Georgia, Tahoma, Impact, Comic Sans - Một số cặp như
Ivàlcó thể tiếp tục trông mơ hồ trong nhiều phông chữ, và cũng có những tổ hợp như9qgcòn dễ nhầm hơn khi viết tay trực tiếp -
-
Các loại ID đặc biệt dễ gặp vấn đề
- Mã giảm giá được trao đổi trong hỗ trợ khách hàng
- Mã theo dõi dùng trong giao hàng hoặc logistics
- ID lỗi cần thiết để tái hiện vấn đề và xử lý yêu cầu hỗ trợ
- ID sản phẩm dùng để nhận diện sản phẩm
-
Đánh đổi giữa phân biệt chữ hoa/thường và tập ký tự
- Việc ID có coi
abcvàABClà cùng một giá trị hay không cần được quyết định cùng lúc khi đặt quy tắc sinh ID - Nếu phân biệt chữ hoa/thường và loại trừ các ký tự mơ hồ về mặt thị giác, số ký tự có thể chọn là 53
- Nếu không phân biệt chữ hoa/thường, số ký tự có thể chọn giảm xuống còn 22
- Số tổ hợp có thể có theo độ dài ID như sau
- 5 ký tự, phân biệt chữ hoa/thường:
53^5 = 418,195,493 - 5 ký tự, không phân biệt chữ hoa/thường:
22^5 = 5,153,632 - 8 ký tự, phân biệt chữ hoa/thường:
53^8 = 62,259,690,411,361 - 8 ký tự, không phân biệt chữ hoa/thường:
22^8 = 54,875,873,536
- 5 ký tự, phân biệt chữ hoa/thường:
- Cuối cùng, lựa chọn là cân bằng giữa ID ngắn nhưng có khả năng gây nhầm lẫn cao và ID dài nhưng dễ đọc
- Nếu dùng cả chữ hoa và chữ thường, một lúc nào đó bạn có thể gặp hành vi ngoài dự kiến trong hệ thống hoặc giao thức bên thứ ba không phân biệt chữ hoa/thường
- Một hệ thống thương mại từng cho phép người dùng chọn
iDvàidlàm hai ID khác nhau, nhưng khi tra cứu một ID không tồn tại, hệ thống lại thực hiện đối sánh không phân biệt chữ hoa/thường và trả về dữ liệu sai - Phản hồi cho lỗi đó là đây là hành vi vì “tiện lợi”
- Một hệ thống thương mại từng cho phép người dùng chọn
Có thể cần tránh cả tổ hợp, không chỉ từng ký tự
- Bản thân tổ hợp ký tự cũng có trường hợp trông giống ký tự khác
rncó thể trông giốngmvvcó thể trông giốngw
- Nếu chỉ vì những lý do này mà loại bỏ hàng loạt ký tự, tập ký tự có thể chọn sẽ bị thu hẹp quá nhiều, nên cách thực tế hơn có thể là chỉ tránh một số tổ hợp cụ thể ở bước sinh ID
- Trong tình huống truyền đạt bằng lời nói, cũng có thể cân nhắc sự tương đồng về âm thanh
- Ví dụ
bvàpcó thể nghe giống nhau khi đọc thành tiếng
- Ví dụ
Các phương pháp hiện có đáng tham khảo
- Base32 của Crockford giải mã các ký tự mơ hồ thành cùng một giá trị và cũng cân nhắc vấn đề vô tình tạo ra từ ngữ tục tĩu
- Open Location Code sử dụng tập ký tự
23456789CFGHJMPQRVWX- Tập ký tự này được chọn để tránh các ký tự mơ hồ về mặt thị giác và cũng tránh cách viết thành từ trong ngôn ngữ thông thường
- Tuy nhiên, nó bao gồm cả
6vàG, cũng như9vàQ
3 bình luận
Cái này cũng có vẻ hay: https://stackoverflow.com/a/58098360/8556340
Việc còn tính cả cách phát âm nữa thì thật sự quá kinh ngạc.
Ý kiến trên Hacker News
Ở chỗ làm, chúng tôi từng xuất xưởng hàng triệu thiết bị có gắn số sê-ri, nhưng hoàn toàn không loại trừ các chữ cái hay chữ số dễ gây nhầm lẫn, khiến khách hàng rất vất vả mới đọc đúng được
Tôi đã phải viết một script regex tạo ra mọi tổ hợp lỗi gõ có thể có dựa trên giá trị khách hàng nói, rồi chỉ hiển thị những tổ hợp khớp với cơ sở dữ liệu nhà máy; sau đó đối chiếu thêm các thông tin khác như ngày tháng để suy đoán số sê-ri thật
Điều mỉa mai hơn là một vài vị trí thì không bao giờ thay đổi, còn có vị trí chỉ cần dùng 0, 1, 2 để phân biệt nhà máy, nên ngay từ đầu đã không cần toàn bộ tập ký tự. Cứ như thể họ tin rằng mình sẽ sản xuất 8 triệu tỷ thiết bị vậy
Ví dụ, nếu đánh số sản phẩm tuần tự như 1, 2, 3, chỉ với một mẫu nhỏ cũng có thể ước tính khá dễ tổng doanh số. Làm cho số sê-ri hợp lệ khó đoán cũng có lúc giúp ngăn những việc như lạm dụng hoàn tiền
Dĩ nhiên, dù có những lo ngại như vậy thì vẫn có thể đồng thời tránh các ký tự khó đọc; và nếu điều đó cho thấy có ai đó đang suy nghĩ về việc dùng hệ thống số nào, thì lẽ ra họ phải nhận ra vấn đề này rõ hơn. Trên thực tế, có vẻ rất có thể ai đó đã nghĩ khoảng 30 giây rồi nói “dùng chừng này chữ số thì không bao giờ hết đâu, xong”
Có vẻ số sê-ri thiết bị chỉ dùng phụ âm và chữ số
Cách mã hóa nên phụ thuộc vào người dùng. Base32, đặc biệt là Crockford và RFC 4648, rất phù hợp để biểu diễn ngắn gọn và có bảng chữ cái không mơ hồ cùng lý do rõ ràng
Nhưng nếu người dùng phải đọc thành tiếng, thì cách biểu diễn bằng danh sách từ như s/key RFC 1751, chẳng hạn “TIDE ITCH SLOW REIN RULE MOT”, có thể tốt hơn
Đừng tự tạo danh sách từ. Có vô số cạm bẫy ẩn như thành ngữ, từ đồng âm, phương ngữ, v.v. Đừng vô tình tạo ra một thảm họa kiểu “wet clam butterfly”
RFC 1751 [0], nơi ví dụ này xuất hiện, không giả định mã hóa để truyền đạt bằng lời nói, mà nhằm giúp người dùng “đọc, ghi nhớ và nhập” dễ hơn
Nếu các chuyên gia truyền miệng cho nhau, lựa chọn hợp lý là chỉ dùng 26 chữ cái viết hoa và dựa vào bảng chữ cái phiên âm NATO. Nhưng việc lấy mã từ người dùng chưa được huấn luyện trong môi trường nói có nhiều nhiễu vẫn là một vấn đề chưa được giải quyết
[0] https://datatracker.ietf.org/doc/html/rfc1751
Ngay từ đoạn “phải dùng thuật toán message digest có khóa MD5, và nó đủ mạnh” đã buồn cười rồi
Đến “khó đọc, khó nhớ và khó nhập với hầu hết mọi người” thì vẫn ổn, nhưng rồi lại chuyển thành “từ tiếng Anh dễ nhớ và dễ nhập hơn nhiều đối với mọi người”. Vấn đề là hầu hết mọi người không biết tiếng Anh; tôi đã nghĩ hay là thay danh sách từ, nhưng tài liệu lại nói “vì tính tương tác, không nên có từ điển riêng cho từng ngôn ngữ”
Rốt cuộc lập luận kiểu cả thế giới đã học 26 chữ cái tiếng Anh rồi thì thêm vài từ cũng ổn, nhưng trong
char Wp[2048][4] = […]không phải là những từ phổ biến phù hợp cho người mới học, mà là những thứ như “WAD, BESS, MERT…”. Thậm chí còn có “ORR? AGEE EGAN HAAS!!”, “GAUL FLAM! DRAB!” nữaChuyện này làm tôi nhớ lại một việc cũ. Một ngày bị ốm, để quên đi cảm giác đau nhức, tôi đã làm một mô-đun đồ chơi thực hiện số học với cơ số tùy ý, và vì nó đơn giản nên đưa lên CPAN
Mô-đun đó là https://metacpan.org/pod/Math::Fleximal
Trong số những thứ lặt vặt tôi làm, tôi nghĩ thứ này chắc chắn sẽ không bao giờ có yêu cầu hỗ trợ, nhưng thực tế lại có. Lý do là tôi đã đưa vào một ví dụ chuyển hệ thập lục phân thành mã chữ-số, và ai đó đã có ý tưởng tuyệt vời là dùng nguyên xi nó để biến các số dài thành mã dễ đọc
Mô-đun hoạt động tốt, nhưng việc nó lọt vào production ở đâu đó thì khá khó tin
Bài viết nhấn mạnh nên tránh các ký tự khó phân biệt cả khi viết tay, nhưng trong bảng ví dụ lại có chữ số 7. Tôi đã gặp vô số trường hợp khó phân biệt số 7 của ai đó với số 1
Gạch ngang số 7 thì có ích, nhưng nhiều người không viết như vậy, nên đôi khi khó chắc đó là số 7 hay số 1 có chân serif
Có lúc hai chữ này gần như không phân biệt được. Có thể dùng bảng chữ cái chuẩn NATO/hàng không (Alpha, Bravo, Charlie, Delta...), nhưng nếu nhóm khách hàng không bị giới hạn rất chặt thì cũng không giúp được nhiều. Tốt hơn là nên tránh cả những tổ hợp như vậy
Dù chuỗi ID có dài hơn một chút, tối đa hóa khả năng đọc, nói và nghe ký tự vẫn tốt hơn nhiều, và tiết kiệm được rất nhiều thời gian lẫn bực bội
Tôi tò mò kiểu chữ viết tay nào khiến 1 giống 7. Chỉ riêng nét ngang trên của 7 có lẽ đã đủ phân biệt rồi
Nếu dùng cả chữ hoa và chữ thường, sớm muộn gì cũng có khả năng bị một hệ thống hoặc giao thức bên thứ ba không phân biệt hoa thường làm hại
Tôi từng thấy một hệ thống thương mại cho phép người dùng chọn ID có phân biệt hoa thường, chấp nhận
iDvàidlà hai giá trị khác nhau, nhưng khi tra cứu một ID không tồn tại thì lại khớp không phân biệt hoa thường và trả về dữ liệu saiKhi tôi báo lỗi này, họ trả lời đó là “tính năng để tiện dụng”
Khi nhập số sê-ri DLC trên Nintendo Switch, các phím ký tự dễ gây nhầm lẫn đã bị vô hiệu hóa trên bàn phím ảo, và tôi thấy đó là một trải nghiệm người dùng khá tốt
Điều này có nghĩa là ngay từ đầu số sê-ri đã được tạo ra mà không có các ký tự dễ gây nhầm lẫn. Tôi không rõ UX này được tích hợp sẵn trong hệ điều hành, hay chỉ có trong trò Mario + Rabbids Sparks of Hope mà tôi đang chơi
Trình quản lý mật khẩu mã nguồn mở KeepassXC dùng màu sắc để giúp mật khẩu dễ đọc hơn. Cách làm là dùng màu khác nhau cho từng loại ký tự như chữ hoa, chữ thường, chữ số và ký hiệu
Đây là một ý tưởng rất đơn giản, nhưng đặc biệt với mật khẩu ngẫu nhiên thì nó giúp ích rất nhiều, ngay cả khi đã dùng phông chữ dễ đọc
Thật khó hiểu khi phần mềm tập trung vào mật khẩu lại cho phép hiển thị ký tự bằng phông chữ mơ hồ mà không có bất kỳ phân biệt màu sắc nào
Cảm giác đang nhập một mật khẩu dài bằng giao diện như điều khiển TV rồi nhận ra mình đã nhầm
l1|Ithật sự rất bực, nên tôi tự loại trừ chúngĐây là bài viết nói về một vấn đề tôi thường gặp nên đọc rất thú vị
Mỗi lần ghi mã dự phòng xác thực hai bước ra giấy, tôi lại thấy bất an khi gặp các ký tự như
o/0,v/u,5/S. Vì vậy tôi cố ý viết chúng hơi cách điệu để trông khác nhauPhần “tương đồng về âm thanh” làm tôi nhớ đến lúc chọn mật khẩu Wi‑Fi. Tôi muốn một từ phổ biến, có thể chia sẻ bằng một câu mà không mơ hồ, học sinh lớp 3 cũng đánh vần được, và có nhiều phụ âm; cuối cùng tôi chọn “vacation”
5/S,0/O,8/B. Trên thực tế, các cặp gây vấn đề sẽ khác nhau tùy theo chữ viết tay của mỗi ngườiNếu thật sự không chắc, tôi còn ghi thêm bảng chữ cái NATO/hàng không [1]. Ví dụ nếu có
U, tôi bắt đầu từUrồi viết chéo raUniformChỉ cần một chút kỷ luật. Tôi đã làm vậy hơn 10 năm và chưa từng làm mất mã xác thực hai bước lần nào
[1] Mọi bắt bẻ về khác biệt thực tế giữa mã NATO và mã hàng không có thể an toàn gửi vào
/dev/nullCái đầu mới là nút thắt cổ chai
Tôi thích những cuộc thảo luận như thế này. Có thể đây không phải chủ đề tiên tiến hay hấp dẫn, nhưng nó rất có ý nghĩa và sức mạnh trong việc giúp cuộc sống của cả con người lẫn máy móc dễ dàng hơn
Những thứ này cũng thuộc vùng best practice mà khi làm tốt thì ngược lại chẳng ai nhận ra. Thật tiếc là sự tận tâm và chân thành trong từng chi tiết lại bị xem như “đương nhiên phải thế” và không được khen ngợi đặc biệt
Nếu chỉ ra lỗi trong bài, ở
9qg6G8B2Z5SIl170O (ariel), tên phông chữ không phải Ariel mà là Arial. Nàng tiên cá không có ở đâyTrên Linux, hầu hết các dòng trông giống hệt nhau
https://github.com/gajus/gajus-com/blob/main/src/blogPosts/2...
Tôi đã sửa lỗi chính tả rồi