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

Mã BIC ở cuối một Container

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

Thống nhất hệ thống sửa

Ví dụ về một số Container đúng chuẩn ISO 6346

 

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 sửa

  • 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 sửa

Visual Basic (VBA) sửa

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 sửa

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 sửa

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 sửa

Tham khảo sửa