最近遇到一个问题,需要将数字 ID 转化为字母 ID,而且需要有一种对应关系保证数字 ID 和字母 ID 一一对应,如 11 可以转化为 aa 这样,求各位大佬给出算法或思路.
1 izdour 2017-03-05 14:01:25 +08:00 。。。 md5 或 哈希?这是什么问题 |
![]() | 2 RE 2017-03-05 14:01:43 +08:00 via iPhone ![]() 10 进制转 26 或 52 进制 |
![]() | 3 shoaly 2017-03-05 14:05:45 +08:00 echo "1234567890" | base64 MTIzNDU2Nzg5MAo= |
![]() | 4 SoloCompany 2017-03-05 15:06:54 +08:00 via iPad 理论的最优解的话当然是 Long.toString(id, 62 或 52),要求数字可以超过 64bit 的话可以用 bigdecimal |
![]() | 5 zsx 2017-03-05 15:41:28 +08:00 ![]() '123456'.toString().replace(/\d/g, s => String.fromCharCode(parseInt(s) - 1 + 'A'.charCodeAt())) === 'ABCDEF' |
![]() | 6 loading 2017-03-05 15:43:32 +08:00 via Android 0-9 一共 10 个,字母大小写一共 52 个,映射不就好了? |
8 syncher OP 有没有用 ASCII 的方法? |
![]() | 9 xiaozi 2017-03-05 17:55:17 +08:00 加密版本标识 + base62_encode(id * scale 倍数 + 偏移值) |
![]() | 10 xiaogui 2017-03-05 18:13:36 +08:00 楼主试试这个 http://hashids.org/ |
![]() | 11 changwei 2017-03-05 18:45:10 +08:00 via Android 为什么会有这么奇怪的需求啊 |
![]() | 13 cnwtex 2017-03-05 21:22:58 +08:00 @isCyan function id62($strnum,$isdecode = false){ $id62obj = load::classes('id62','','LkEhbDuyXTV8iMrcIPNCGQqm1sHz2Kw5eafnJS4vYoj7gWORtF30pA6dZUlBx9'); if($isdecode){ return $id62obj->decode($strnum); }else{ return $id62obj->encode($strnum); } } id62 就是 62 进制函数 |
![]() | 16 NeoAtlantis 2017-03-06 04:36:13 +08:00 via Android 直接找个加密算法大不了 AES 把数字加密然后转成 base64 ……密钥什么的自己定。可以双向转换,保证一对一,保证随机。 |