使用唯一的电话号码(0241194000
例如
例子
Number : 0241194000 LENGHT(10)
PIN : 675436 LENGHT(6) ONLY NUMERIC
Checker : 673AA3738SHZXCVDER ANY LENGTH ALPHANUMERIC.
任何链接或帮助都会很棒。
使用唯一的电话号码(0241194000
例如
例子
Number : 0241194000 LENGHT(10)
PIN : 675436 LENGHT(6) ONLY NUMERIC
Checker : 673AA3738SHZXCVDER ANY LENGTH ALPHANUMERIC.
任何链接或帮助都会很棒。
尽管上面有关于您无法创建比其源集短的唯一 PIN 的正确评论(它归结为散列,根据定义永远不会唯一),但我假设您的意思是“无法复制的代码”外人的电话号码,并且在给定电话号码和 PIN 的情况下,可以证明是相关的,同时接受相同的 PIN 在与另一个电话号码一起使用时也可能有效”。
假设,最简单的解决方案是从电话号码创建一个加盐哈希。示例伪代码:
static uniqueHash = '9t45uufg92dit093ik,96igm0v9m6i09im09i309disl54923';
function createPinFromPhone(string phonenumber)
{
string pin = '';
do {
hash = md5(phonenumber+uniqueHash);
pin += extractNumbersFromString(hash);
phonenumber = pin+hash;
}
while(pin.length < 6)
return pin.subString(0, 6);
}
这是一个函数的(粗略)示例,该函数将始终从同一个电话号码返回相同的 pin 码,并且通过使用唯一的密钥,外人永远无法复制。从理论上讲,您可能会遇到熵问题,但实际上并非如此。
您正在寻找一个数学双射函数(最好是一个复杂的函数),它允许通过所述函数将任何数字 (x) 转换为 PIN
F(Number) = PIN
通过具有双射函数,您可以通过在相反方向求解方程来验证 PIN。
http://en.wikipedia.org/wiki/Bijection
例如:
给定函数:F(Number) = Number*2
function GeneratePIN(Number)
return Number*2
end
function validatePIN(PIN,Number)
return PIN == Number*2
end
如果您只想从电话号码创建一个 PIN(其中电话号码是唯一的,PIN 不一定是唯一的),您可以使用许多散列函数之一,例如 CRC32、MD5、SHA1 ......只是您需要的字节数/数字。
请注意,使其安全(如果您愿意的话)并不简单,因为散列函数通常只会使找出原始值变得更加困难(在您的情况下,从 PIN 中找出数字),反之亦然。