À mà CRC16 sẽ cho ra kq có thể lớn nhất là 5 số đó bạn, max 32767 hay 65535.
Và kg thể tính ngược lại số ban đầu, tức chỉ mã hóa 1 chiều đó bạn.
Dùng được kg ?
Uhm, chuỗi khác nhau cho ra Crc16 khác nhau.
Nhiều mênh mông, bạt ngàn source code cho hàm Crc16. Bạn google vba crc16, rồi chọn 1 cái.
Có rất nhiều biến thể của thuật toán Crc16,bạn kg cần hiểu sâu. Chỉ cần copy code về dùng
Option Explicit
Private Function CRC16(ByVal iCrc As Integer, ByVal uChar As Integer) As Integer
Dim iCarry As Integer, I As Byte
For I = 0 To 7
iCarry = (iCrc And 1) Xor IIf(uChar And (2 ^ I), 1, 0)
iCrc = (iCrc And &HFFFF&) \ 2
If iCarry <> 0 Then iCrc = iCrc Xor &H8408
Next I
CRC16 = iCrc
End Function
Public Function CalcCRC16(ByVal strInput As String) As String
Dim iCrc As Integer, I As Integer
Dim strRet As String
iCrc = &H8408
For I = 1 To Len(strInput)
iCrc = CRC16(iCrc, AscW(Mid$(strInput, I, 1)))
Next
strRet = Hex$(iCrc)
For I = 1 To 4 - Len(strRet)
strRet = "0" & strRet
Next
CalcCRC16 = strRet
End Function
Giả sử A1 là số đt, bạn gõ vào B1 (hay cell bất kỳ bạn muốn): =CalcCRC16(A1), xong muốn kéo muốn fill gì tùy ý
Chơi cái này cũng vui!
Giải pháp: ngắt 10 chữ số thành 5 phần, mỗi phần 2 chữ số, tức chỉ cần mã hóa 100 con số từ số 00 đến số 99 là xong.
Cột A: chứa chữ số từ 00 đến 99
Cột B: chứa các ký tự thay thế.
Côt E: ghi số điện thoại hoc sinh muốn "mã hóa"
Dùng hàm tự tạo JoinText() của thầy @ndu96081631, cụ thể như sau:
Làm cho vui mà!
Thực ra, bảng mã này bạn có thể tự chế biến theo ý mình, ví dụ: nếu bạn không thích những ký tự nho nhỏ như: "'.,'"... thì bạn có thể thay bằng số 0->9 (như file kèm). Khi có bảng mã thì "Đổi ngược" hay "Đổi xuôi" tùy ý mình,
"Tự do tự tại không bị ràng buộc" hợp với bản tính của tôi.
Mình vừa tìm ra 1 cách khác, đơn giản hơn, dùng chính lớp Dictionary. Đọc source C/C++ của nó (scrrun.dll) phát hiện ra.
Dictionary có 1 hidden property tên là "HashVal", method trong source C/C++ là get_HashVal. Mục đích nó là sinh mã băm (hash value) cho Key property. Chúng ta có thể gọi nó qua hàm CallByName của VB/VBA.
Mã băm này không trùng nhau cho các key khác nhau, là duy nhất.
Bạn chủ thớt có thể dùng hàm nay tương tự như hàm CalcCRC16 ở trên.
Mã:
Option Explicit
Private m_dict As Scripting.Dictionary
Public Function GetHash(ByVal strKey As String) As String
Dim I As Long
Dim strHash As String
If m_dict Is Nothing Then
Set m_dict = New Scripting.Dictionary
End If
strHash = CallByName(m_dict, "HashVal", VbGet, strKey)
strHash = Hex$(strHash)
For I = 1 To 4 - Len(strHash)
strHash = "0" & strHash
Next
GetHash = strHash
End Function
Source code C/C++ của HashVal property trong scrrun.dll
Làm cho vui mà!
Thực ra, bảng mã này bạn có thể tự chế biến theo ý mình, ví dụ: nếu bạn không thích những ký tự nho nhỏ như: "'.,'"... thì bạn có thể thay bằng số 0->9 (như file kèm). Khi có bảng mã thì "Đổi ngược" hay "Đổi xuôi" tùy ý mình,
"Tự do tự tại không bị ràng buộc" hợp với bản tính của tôi.
Làm cho vui mà!
Thực ra, bảng mã này bạn có thể tự chế biến theo ý mình, ví dụ: nếu bạn không thích những ký tự nho nhỏ như: "'.,'"... thì bạn có thể thay bằng số 0->9 (như file kèm). Khi có bảng mã thì "Đổi ngược" hay "Đổi xuôi" tùy ý mình,
"Tự do tự tại không bị ràng buộc" hợp với bản tính của tôi.
Làm cho vui mà!
Thực ra, bảng mã này bạn có thể tự chế biến theo ý mình, ví dụ: nếu bạn không thích những ký tự nho nhỏ như: "'.,'"... thì bạn có thể thay bằng số 0->9 (như file kèm). Khi có bảng mã thì "Đổi ngược" hay "Đổi xuôi" tùy ý mình,
"Tự do tự tại không bị ràng buộc" hợp với bản tính của tôi.
1. Vì ban đầu chủ thớt đã yêu cầu 4 chữ số nên tôi mới dùng CRC16, và biết là có thể sẽ xảy ra trùng CRC. Tôi đã nói trước. Dùng CRC32 hay CRC64 sẽ không trùng nhưng lại không đúng yêu cầu của chủ thớt.
2. Nhanh nhẩu đoản, tưởng tìm ra bug của scrrun.dll, hì hì, nhưng không phải. HashVal chỉ là 1 phần trong bảng băm của dictionary. Source của lớp Dictionary và method Exists có thể xem ở đây:
Vậy thì không dùng cách HashVal được. Chủ thớt bỏ đi.
Tui dùng đt 10 số trước giờ nên không để ý, với đt 12 số, 13 số... sau này, bắt đầu từ mấy tới mấy vậy các bác, để tui test luôn, có thể chuyển qua CRC32
Đúng là ngớ ngẩn thiệt, cứ đi tìm giải pháp đao to búa lớn. Bản thân 1 số nó đã là duy nhất, thì chỉ cần đổi base cho nó nó thành biểu diễn ít ký tự hơn thì nó vẫn là duy nhất. Nên đổi base quách là xong
Có các base từ 2 (nhị phân) tới 10 (decimal) tới 16 (hex) tới 36, là phổ biến nhất. Tôi thử với nhiều base rồi, chọn base 36 vì nó cho ra nhiều nhất là 6 ký tự với dãy số đt 10 số hiện nay. Chủ thớt mà đòi 4 hay nhỏ hơn thì cu anh tui thua
Trang web để các bạn thử đổi base:
Free online numbers converter - converts between 40 units of numbers, including binary, octal, decimal, hexadecimal, etc. Also, explore many other unit converters or learn more about numbers unit conversions.
www.unitconverters.net
Từ Excel 2013 trở lên đã có hàm BASE này, nếu chủ thớt dùng Excel2013 thì dùng Base(x, 36) để đổi qua Base 36 value, và Decimal để đổi ngược lại.
Nếu chủ thớt dùng Excel nhỏ hơn 2013 thì dùng hàm copy từ Gú gồ của tui. Đổi ngược lại thì chủ thớt tự viết nhé
Xin xem file đính kèm.
The end.