Iso 6346

ISO 6346 là một chuẩn quốc tế quy định để mỗi số Container là duy nhất.

Chuẩn này được quy định và quản lý bởi International Container Bureau (BIC)

 Thống nhất hệ thống 
Ví dụ về một số Container đúng chuẩn ISO 6346

Example of an ISO 6346 conform container number|300px

Trong đó:
 CSQ là tên chủ sở hữu Container (hãng tàu)
 U là phần danh mục thiết bị. Có 03 chữ: U: tất cả container nói chung; J: các container có thể tháo lắp; Z: dành cho Moors và Chassis
 305438 là phần số được cấp phát bởi hãng tàu và là duy nhất.
 3 là con số cuối cùng dùng để kiểm tra số container có đúng chuẩn ISO 6346 (check digit).

 Quy tắc tính số Check Digit 
 Tách số Cont (11 số) thành 02  phần: 10 ký tự đầu + số cuối cùng
 Tính toán 10 ký tự đầu => số Check Digit so sánh với số cuối cùng, nếu trùng nhau => hợp chuẩn ISO 6346
Ví dụ: Ta có số Cont: CSQU3054383

Ta sẽ tách 10 ký tự đầu: CSQU305438 để tính toán => số Check Digit

Nếu số Check Digit = 3 + đúng chuẩn ISO 6346.

Các chữ cái tương ứng với các con số trong bảng sau:

A  B  C  D  E  F  G  H  I  J  K  L  M  10 12 13 14 15 16 17 18 19 20 21 23 24

N  O  P  Q  R  S  T  U  V  W  X  Y  Z  25 26 27 28 29 30 31 32 34 35 36 37 38

 C S Q U 3 0 5 4 3 8 Calc.  13 30 28 32 3 0 5 4 3 8  × 1 2 4 8 16 32 64 128 256 512  13 60 112 256 48 0 320 512 768 4096 6185 [a] [b] Chia cho 11: 562,272... [c] Làm tròn: 562 [d] Nhân với 11: 6182 [a] trừ [d] = Check Digit: 3
Như vậy trong ví dụ trên số Cont: CSQU305438 sẽ có Check Digit = 3

 Một số giải thuật tính số Check Digit trong lập trình 
 Visual Basic (VBA) 
Function ISO6346Check(k As String) ' Calculates the ISO Shipping Container Check Digit
Dim i%, s&
Application.Volatile
For i = 1 To 10
s = s + IIf(i < 5, Fix(11 * (Asc(Mid(k, i)) - 56) / 10) + 1, Asc(Mid(k, i)) - 48) * 2 ^ (i - 1)
Next i
ISO6346Check = (s - Fix(s / 11) * 11) Mod 10
End Function

Java Script

function ISO6346Check(con) {
    if (!con || con == "" || con.length != 11) { return false; }
    con = con.toUpperCase();
    var re = /^[A-Z]{4}\d{7}/;
    if (re.test(con)) {
        var sum = 0;
        for (i = 0; i < 10; i++) {
            var n = con.substr(i, 1);
            if (i < 4) {
                n = "0123456789A?BCDEFGHIJK?LMNOPQRSTU?VWXYZ".indexOf(con.substr(i, 1));
            }
            n *= Math.pow(2, i); //2的i次方
            sum += n;
        }
        if (con.substr(0, 4) == "HLCU") {
            sum -= 2;
        }
        sum %= 11;
        sum %= 10; //余数为10的取0
        return sum == con.substr(10);
    } else {
        return false; //不匹配正则表达式   
    }
}

PHP

function checkDigit($mark){
    $char2num = ['A'=>10, 'B'=>12, 'C'=>13, 'D'=>14, 'E'=>15, 'F'=>16, 'G'=>17, 'H'=>18, 'I'=>19, 'J'=>20, 'K'=>21, 'L'=>23, 'M'=>24, 'N'=>25, 'O'=>26, 'P'=>27, 'Q'=>28, 'R'=>29, 'S'=>30, 'T'=>31, 'U'=>32, 'V'=>34, 'W'=>35, 'X'=>36, 'Y'=>37, 'Z'=>38];

    $acc=0;
    $num=str_split($mark);
    for($i=0;$i<10;$i++){
        if($i<4) $acc+=($char2num[$num[$i]]*pow(2,$i));
        else $acc+=$num[$i]*pow(2,$i);
    }
    $rem = $acc % 11;
    if ($rem == 10) $rem = 0;
    if(strlen($mark)==11 && $num[10]==$rem) return true;
    return false;
}

 Liên kết ngoài 
 Phần mềm Check container chạy trên di động Android

Tham khảo

Thể loại:Mã hóa
Thể loại:Tiêu chuẩn ISO