怎么生成短hash

2013-07-16 09:23:19 +08:00
 rppig42
看别人的网站,比如用户ID,文章ID,都是很短一串随机数字。

比如 http://angularjs.cn/A07V

比如 http://www.zhihu.com/question/21338805

这种序列是怎么生成的?

我想到的一个很蠢的方法是:MD5以后取其中几位,如果重复,则取后几位,太笨了..自己都不好意思说。

求指导
8970 次点击
所在节点    程序员
13 条回复
alexrezit
2013-07-16 09:25:46 +08:00
字母 + 数字, 递增...
subpo
2013-07-16 09:26:36 +08:00
谷歌uuid,会有各种语言下的解决方案
lichao
2013-07-16 09:27:18 +08:00
不区分大小写的话,可以使用 36 进制
rppig42
2013-07-16 09:41:50 +08:00
@alexrezit
肯定不能递增的,不然直接从1开始加,效果一样的
@subpo
uuid获取到的字符串还是太长了,
后来想了下,搜了下短链生成算法,得到了解决方案。 thks
subpo
2013-07-16 09:47:44 +08:00
@rppig42 其实我昨天才问这个问题,分享两个挺hack的写法给你

(((1+Math.random())*0x10000)|0).toString(16).substring(1)

Math.random().toString(32).substr(2)
xing393939
2013-07-16 09:52:40 +08:00
我有个比较弱的实现:http://www.v2ex.com/t/66561#reply28
其实就是密码表,但是这个贴说密码表近似于明文:http://www.v2ex.com/t/75769
或者uuid:http://wenku.baidu.com/view/482a9d4a2e3f5727a5e96226
当然仅仅用于使网站的id的自增情况不让人知道,这样的应该够用了
reorx
2013-07-16 13:01:50 +08:00
bergkamp
2013-07-16 14:06:22 +08:00
base62encode
msg7086
2013-07-16 16:04:03 +08:00
以前在jSharer做过整数到短地址的映射。说白了就是base62编码,但是可以改变码表顺序做出自己的映射来。
darasion
2013-07-16 16:17:09 +08:00
表示同样的数字(比如数据库ID):

2 进制很长很长,{0, 1}
8 进制稍微短了一些,{0~8}
10进制比八进制短,{0~9}
16进制更短,{0~9, a~f}
....
以此类推....
62进制(就是楼上很多人说的base62),{0~9,a~z,A~Z}
加URL中允许使用的上减号和下划线,甚至也可以(base64),{0~9,a~z,A~Z,-,_}

其实就是进制转换了,没啥高科技。
Actrace
2013-07-16 16:57:06 +08:00
把主键ID转换成64进制字符串.
openroc
2013-07-16 16:58:36 +08:00
看一下python的hash函数的源码
avenger
2019-04-30 01:43:05 +08:00
base_convert($num, 10, 36)

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

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

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

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

© 2021 V2EX