根据电话号码生成唯一的PIN码

本文关键字:PIN 唯一 电话号码 | 更新日期: 2023-09-27 18:11:55

对于唯一的电话号码,如0241194000,我想根据电话号码生成一个PIN码,并且还想检查或验证PIN码是否真的是从电话号码生成的。

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

任何链接或帮助将是伟大的。

根据电话号码生成唯一的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

尽管上面正确的评论,你不能创造一个独特的针,短于其来源(它可以归结为哈希,这是通过定义没有独特的),我猜你的意思是"不能复制电话号码的代码通过一个局外人,而且,考虑到电话号码和密码,可以证明是相关的,而接受相同的针也可以有效使用另一个电话号码"。

假设,最简单的解决方案是从电话号码创建一个加盐哈希。样本的伪代码:

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码,并且通过使用唯一的密钥,外人永远无法复制。理论上你可以有一个熵的问题,但在现实中不是这样的规模。

如果你只是想从一个电话号码创建一个PIN(其中电话号码是唯一的,PIN不一定是唯一的),你可以使用许多哈希函数之一,如CRC32, MD5, SHA1,…只取你需要的字节/数字。

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