怎样写一个hash算法其结果为8位包含大/小写字母和数字?

2013-06-18 19:09:06 +08:00
 andybest
鉴于目前安全事故频发,我打算简单写一个hash算法,输入例如“v2ex”然后算出一个8位包含大小写字母的密码

怎样写这个hash算法?想听听各位的意见 :)
8924 次点击
所在节点    问与答
35 条回复
lichao
2013-06-19 11:22:21 +08:00
一般来说 SHA256 + 随机盐 就可以应付了
andybest
2013-06-19 11:28:21 +08:00
@lichao sha不区分大小写,并且截取8位可能不满足包含数字/字母
lichao
2013-06-19 11:32:29 +08:00
@andybest 我觉得既然有现成的 hash 算法了,没必要自己再去实现一个 hash 算法了吧。
而且你不觉得 8 位的 hash 很容易撞车吗?
andybest
2013-06-19 11:41:13 +08:00
@lichao 撞车无所谓阿

实际上就是需求一个: 必然包含大/小写字母和数字 hash算法的思路

想听听大家的想法
zoho
2013-06-19 11:41:15 +08:00
(1)根据已知 hash 算法生成一个较长的 X 值,分为 7 段;X1 到 X7;

(2)用 X1,X2,X3 分别确定大写字母,小写字母,数字三部分的各自长度;

(3)分别用 base26,base26,base10 从 X4,X5,X6 中截取前面三部分的字符;

(4)利用 X7 值打乱字符串的顺序。
andybest
2013-06-19 11:45:04 +08:00
@zoho 感谢,好想法

请问:(4)利用 X7 值打乱字符串的顺序。

这个是使用X7安排 三部分字符 组合逻辑吗?
这一部分怎么实现可以给个例子吗?

比如X7是xxx, 在base26/26/10分别为xxx的时候如何组合。
就是怎样利用X7组合这三个段?
Sunyanzi
2013-06-19 11:54:26 +08:00
@andybest 这个其实交由你自己来决定 ... 我可以提供一个参考思路 ...

假设第三段是个 20 位的 hexstring ... 先取前四位 ... 模 8 取得一个值 ...

如果这个值等于 0 的话继续往下取一位也就是取前五位模 8 ... 直到取得非零值为止 ...

如果十二位都走完了模依然为零 ... 说明这个 hexstring 由 1 0 和 8 组成 ...

我们为这种特殊情况手动定义一个值 ... 比如 3 ... 这个值代表结果中的数字个数 ...

现在假设我们用前五位取到了非零值 ... 以 5 为例吧 ...

后面还剩下十五位 ... 把第三段的开头一位补进来凑够十六位 ... 然后两位一分组 ...

现在我们得到了八个两位的 hexstring ...

前五个 hexstring 模 10 得到五个数字 ... 后三个 hexstring 模 26 得到三个字母 ...

继续处理这八个 hexstring ... 每个 hexstring 取第一位 ... 这代表结果的排序 ...

按照这个排序把我们得到的字母与数字放入对应的位置 ...

假如对应的位置已经有值的话就往后推一位 ... 直到可以放入为止 ...

八位都填入之后 ... 去除没有内容的空位 ...

我们就最终得到了一个肯定包含字母与数字的八位 hash ...

写的比较着急可能有点乱 ... 但大体意思是这样 ... 能看懂么 ..?
Sunyanzi
2013-06-19 11:57:54 +08:00
@Sunyanzi 修正错误 ... 行 4 ... 十二位 改为 二十位 ...
zoho
2013-06-19 11:59:25 +08:00
@andybest 模运算啊,将 X7 再分为 7 个数,第一个数模 8 得到该选取 8 个字符中第几个字符,第二个数模 7 得到该选取剩下 7 个字符中的第几个字符,一直下去。。。
andybest
2013-06-19 12:05:22 +08:00
@Sunyanzi 完全明白,感谢!这个方法很好,我打算就这么做
andybest
2013-06-19 12:07:51 +08:00
@zoho 感谢,你的方法结合 @Sunyanzi 的解决方案我就很明白了

这应该是最优的解决方案了吧!
notedit
2013-06-19 12:09:12 +08:00
从base62中截取6位 其他两位根据一定的算法一个是数字一个是字母
Sunyanzi
2013-06-19 12:19:14 +08:00
@andybest 取模是相对最容易想到的解决方案 ... 对应一般情况也够用 ...

如果考虑到海量样本数量下平衡所有字符的出现率什么的问题 ... 还可以做的更复杂 ...

基本上说到底这就是一个数字到字符的转化 ... 怎么实现还是看个人创意的 ...
andybest
2013-06-19 13:07:00 +08:00
@Sunyanzi 非常感谢! :)
wlwood
2018-05-04 15:15:49 +08:00
8 位太短了吧?

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

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

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

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

© 2021 V2EX