0

使用唯一的电话号码(0241194000例如

例子

Number  : 0241194000                      LENGHT(10)
PIN     : 675436                          LENGHT(6)     ONLY NUMERIC
Checker : 673AA3738SHZXCVDER              ANY LENGTH    ALPHANUMERIC.

任何链接或帮助都会很棒。

4

3 回答 3

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);
}

这是一个函数的(粗略)示例,该函数将始终从同一个电话号码返回相同的 pin 码,并且通过使用唯一的密钥,外人永远无法复制。从理论上讲,您可能会遇到熵问题,但实际上并非如此。

于 2013-05-02T14:54:08.837 回答
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
于 2013-05-02T14:41:53.910 回答
0

如果您只想从电话号码创建一个 PIN(其中电话号码是唯一的,PIN 不一定是唯一的),您可以使用许多散列函数之一,例如 CRC32、MD5、SHA1 ......只是您需要的字节数/数字。

请注意,使其安全(如果您愿意的话)并不简单,因为散列函数通常只会使找出原始值变得更加困难(在您的情况下,从 PIN 中找出数字),反之亦然。

于 2013-05-02T14:48:13.767 回答