不要檢索現有的代碼,只是產生一個潛在的新代碼,看看是否有任何衝突的人在數據庫:
SELECT code FROM table WHERE abs(code-?) regexp '^[1-9]?0*$';
(其中佔位符是新生成的代碼)。
啊,我錯過了很多代碼一次生成的部分。這樣做(完全未經測試):
my @codes = existing_codes();
my $frontwards_index = {};
my $backwards_index = {};
for my $code (@codes) {
index_code($code, $frontwards_index);
index_code(reverse($code), $backwards_index);
}
my @new_codes = map generate_code($frontwards_index, $backwards_index), 1..10000;
sub index_code {
my ($code, $index) = @_;
push @{ $index{ substr($code, 0, length($code)/2) } }, $code;
return;
}
sub check_index {
my ($code, $index) = @_;
my $found = grep { ($_^$code) =~ y/\0//c <= 1 } @{ $index{ substr($code, 0, length($code)/2 } };
return $found;
}
sub generate_code {
my ($frontwards_index, $backwards_index) = @_;
my $new_code;
do {
$new_code = sprintf("%07d", rand(10000000));
} while check_index($new_code, $frontwards_index)
|| check_index(reverse($new_code), $backwards_index);
index_code($new_code, $frontwards_index);
index_code(reverse($new_code), $backwards_index);
return $new_code;
}
校驗位是此應用程序的絕佳主意。 – 2011-03-21 17:05:26
這是一個非常好的主意。它還確保沒有兩個代碼只能有一個數字變化,因爲更改任何數字也會改變校驗和。 – 2011-03-22 02:24:48
更正 - 更改數字會_可能會更改校驗和。如果你嘗試過,你可以創建兩個只相差一個字符的代碼。 – 2011-03-22 02:35:58