使用0241194000
这样的唯一电话号码,我想根据电话号码生成PIN码,还可以检查或验证PIN是否真的来自电话号码。
实施例
Number : 0241194000 LENGHT(10)
PIN : 675436 LENGHT(6) ONLY NUMERIC
Checker : 673AA3738SHZXCVDER ANY LENGTH ALPHANUMERIC.
任何链接或帮助都会很棒。
答案 0 :(得分:1)
您正在寻找数学双射函数(最好是复杂的) 允许任何数字(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
答案 1 :(得分:1)
尽管上面有正确的评论,你不能创建一个比其源集更短的唯一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);
}
这是一个功能的(粗略)示例,它将始终从同一个电话号码返回相同的密码,并且通过使用唯一的密钥永远不会被局外人再现。从理论上讲,你可能会遇到熵问题,但实际上并没有这种规模。
答案 2 :(得分:0)
如果您只想从电话号码创建PIN(电话号码是唯一的,而PIN不一定是唯一的),您可以使用许多散列函数之一,例如CRC32,MD5,SHA1,..并且只需要你需要的字节数/数字。
请注意,使其安全(如果您需要)并不简单,因为散列函数通常只会使得更难以找出原始值(在您的情况下从PIN中找出数字)而不是相反