我需要将mysql自动增量bigint uid' s(1-20位)转换为相同长度的字符串,用于公开显示和url(隐藏真实uid)。
我还需要创建3个变体,每个id每次创建相同的加密字符串(这些变量必须是相同的长度(10-50个字母数字)),每次创建一个不同的/随机字符串,所以显示的id永远不会相同,但仍然可以检索(这些都必须是相同的长度(10-50个字母数字))。 最后一个是短ID(对于用户ID),显示最少量的字符(压缩字符串),字母数字,每个id总是相同(总长度相同,尽可能短);这个只在每个会话中创建一次,因此可能需要更长时间或使用更多资源来创建。
// METHOD 1
$id = '1';
displayed: 64359b7192746a14740a
(same each time, all id's always displayed at same length)
// METHOD 2
$id = '1000000000000000000';
displayed: 746a14740ad4bb7afe4eht36nh
146a7492719b3564094eyu8o0p
fe7abbd40a7416fd90012fvd3e
(different each time, all id's always displayed at same length)
// METHOD 3
$userid = '2598624451675864259';
displayed: aw8qg07nzq
(same each time, all id's always displayed at same length)
我需要一种基本的双向加密或编码方法,速度/更少资源优先于安全性,但不应轻易猜测,以避免计算ID来确定活动。
我尝试过md5哈希,但不想md5搜索或在数据库中存储哈希值。 我已经尝试过其他数字方法,将id填充为20,但最终得到的时间长于想要的60个字符串。尝试使用base_convert作为数字,但id为long和max out。
如果有人能指出我正确的方式,我会很感激。
答案 0 :(得分:0)
放弃首先拥有身份证明。只需创建随机的内容,例如
mysql> SELECT MD5(NOW());
+----------------------------------+
| MD5(NOW()) |
+----------------------------------+
| 9fc432bc91593e8beaf6ffb5b9bf83a0 |
+----------------------------------+
1 row in set (0.00 sec)
然后将该字符串用作PRIMARY KEY
。 MD5
,例如只是单向的,但我认为这并不重要。所有你用双向避免的是一些黑客在玩那些不属于他的ids。
如果MD5太长,请选择更短的内容,但在新的" id"发出。
只要用户和网址提供9fc432bc91593e8beaf6ffb5b9bf83a0
,就会有一个关于解密速度的问题 - 它只是一个查找。