首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将自动递增ID转换为9位随机序列号

将自动递增ID转换为9位随机序列号
EN

Stack Overflow用户
提问于 2012-03-08 18:58:38
回答 5查看 3.3K关注 0票数 3

我有一个包含用户的MySQL数据库。每一行都有一个唯一的自动增量ID (1,2,3...)。现在,我需要将其转换为一个唯一的随机序列号,我可以将其转换回ID -所有这些都使用PHP。

用户ID从1到99999999999 (INT(11))。

所有序列号都应至少包含9位数字,并且不能以0开头。用户应该不容易弄清楚如何猜测一个有效的序列号。

感谢:)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-03-08 21:10:35

你可以做一些简单的“加密”。以一个(‘秘密’)素数p 27407base 17为例。计算基模p-112897的乘法逆invwolframalpha可以为您做到这一点。

Id到序列号

代码语言:javascript
复制
serial = id^base mod p
serial = 42^17 % 27407 = 24978

串行到id

代码语言:javascript
复制
id = serial^inv mod p
id = 24978^12897 % 27407 = 42

这可以通过exponentiation bysquaring快速计算出来。只能使用0到27407之间的ids (如果不能使用更大的质数),并且所有ids都有一个唯一的可逆序列号。

要增加模糊度,可以将结果与某个值进行XOR运算。

这不是真正的密码学,只是愚蠢的security through obscurity,但大多数人要花相当大的力气才能破解。

票数 2
EN

Stack Overflow用户

发布于 2012-03-08 19:01:31

最简单的答案是使用哈希函数,并将秘密盐用作密钥

代码语言:javascript
复制
$secretKey = 'oh no nobody will guess this';
$userId = 312;
$serialNumber = hash('sha256', $secretKey . $userId);

当然,散列是单向的,因此您还必须将序列号存储在DB中,因为您不能根据给定的序列号计算ID。

票数 1
EN

Stack Overflow用户

发布于 2012-03-08 19:06:28

我不会建议你做你想做的事情。

你看,autoincrement通常是用来表示的,以不断避免冗余数据,同时仍然保持的可读性

因此,请更新您的数据库结构以存储散列。其结构可能类似于idhashname等。

在散列中,您可以使用任何逻辑

代码语言:javascript
复制
$hash = sha1("secretanswer".$userid);
$trimmedhash = substr($has,0,9); //get a 9 digit random hash

哈希是一种单向加密,这也是有原因的。无论如何,为了验证散列,您可以再次执行相同的算法

代码语言:javascript
复制
   $userid = "getthissomehow";
   $hash = sha1("secretanswer".$userid);
   $trimmedhash = substr($has,0,9);

   $prevhash = "asfaf23rfs"; //get previously stored hash somehow
   if($trimmedhash == $prevhash) { 
     //valid
   }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9616561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档