你是怎样将数字 ID 转化为字母 ID 的?

2017-03-05 13:51:18 +08:00
 syncher

最近遇到一个问题,需要将数字 ID 转化为字母 ID,而且需要有一种对应关系保证数字 ID 和字母 ID 一一对应,如 11 可以转化为 aa 这样,求各位大佬给出算法或思路.

4087 次点击
所在节点   科技
16 条回复
izdour
2017-03-05 14:01:25 +08:00
。。。 md5 或 哈希?这是什么问题···
RE
2017-03-05 14:01:43 +08:00
10 进制转 26 或 52 进制
shoaly
2017-03-05 14:05:45 +08:00
echo "1234567890" | base64

MTIzNDU2Nzg5MAo=
SoloCompany
2017-03-05 15:06:54 +08:00
理论的最优解的话当然是 Long.toString(id, 62 或 52),要求数字可以超过 64bit 的话可以用 bigdecimal
zsx
2017-03-05 15:41:28 +08:00
'123456'.toString().replace(/\d/g, s => String.fromCharCode(parseInt(s) - 1 + 'A'.charCodeAt())) === 'ABCDEF'
loading
2017-03-05 15:43:32 +08:00
0-9 一共 10 个,字母大小写一共 52 个,映射不就好了?
syncher
2017-03-05 16:26:47 +08:00
@izdour MD5 的话是不是还会有数字??
syncher
2017-03-05 16:28:27 +08:00
有没有用 ASCII 的方法?
xiaozi
2017-03-05 17:55:17 +08:00
加密版本标识 + base62_encode(id * scale 倍数 + 偏移值)
xiaogui
2017-03-05 18:13:36 +08:00
楼主试试这个 http://hashids.org/
changwei
2017-03-05 18:45:10 +08:00
为什么会有这么奇怪的需求啊
isCyan
2017-03-05 19:26:37 +08:00
@changwei 存网址 id 既不想暴露数据库自增值又不想单独存储两种不同 id 的对应关系
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 进制函数
isCyan
2017-03-05 22:21:53 +08:00
@cnwtex 这样还是暴露了自增值啊
cnwtex
2017-03-05 23:08:27 +08:00
@isCyan 没看见字符串是 random 的吗?
NeoAtlantis
2017-03-06 04:36:13 +08:00
直接找个加密算法大不了 AES 把数字加密然后转成 base64 ……密钥什么的自己定。可以双向转换,保证一对一,保证随机。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/345056

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX