Identicon 在很多大型IT网站上可以见到,比如 Github、Sourceforge、Stackoveflow等。Github 给新用户生成 5x5 像素的 Identicons 头像。
Identicon 是如何生成的呢?
每一个用户都有一个ID的哈希值,然后根据哈希值再来决定每个像素点。以5*5 的头像为例,一共有25个像素点,每个像素点可选择 0(无着色) 或 1(着色),理论上可以有$2^{25}$种组合,即使考虑对称性也仍然有$2^{15}$种组合,若是再考虑不同的颜色,那组合会更多。
分享一个哈希头像的生成网站:http://identicon.net,这里可以是用不同的编码方式:MD5、SHA128、SHA256等。
下面分享下用Mathematica生成的头像。
在网络上找到一篇关于用Mathematica生成Identicon程序[1],在此基础上略作修改。程序内有备注,方便阅读。
1 |
name = "Idenicon"; |
在Mathematica中运行上述程序即可生成Identicon头像,你就能看到了。
大致讲一下上述程序的逻辑:
- 将字符串生成由0 和1组成的128位哈希值;
- 将哈希值分组,每16个为一组,一共8组;
- 使用位异或得到每组的0 或1 值;
- 将8个位异或值分成前5组和后3组,其中后3组控制5*5 矩阵的左半边矩阵(5*5)
- 生成了一个5*3的矩阵;
- 将该矩阵做轴对称变换(先转置5*3矩阵,后逆序排列取前两行,再转置成5*2的右矩阵)
- 两个矩阵合并成5*5矩阵,并绘制图像。
这里的可能存在的问题是:
Q: 为什么是128位哈希值,为什么要以16个为一组?
A: 这是可以修改的(在下面的例子中——150位哈希值并以10个为一组)。Q: 这里为什么会出现8?
A: 因为在5*5矩阵,先生成左半边的矩阵,即5*3矩阵;若是10*10矩阵,则会生成10*5矩阵。
2. 用Mathematica生成10*10像素的Identicon头像
我们来试一下10*10像素的Identicon头像吧,只需要把程序中的几行修改一下。
1 |
name = "Identicon"; |
3. 更通用些?
考虑程序的通用性和兼容性,将需要改变的参数(dimension
和elementnum
)列出,就有了以下的调整,其中dimension
是需要生成Identicon的尺寸,例如5*5,10*10等,elementnum
是指划分元素的数目(可不修改)。
1 |
name = "Identicon"; |
生成的Identicon如下图所示。
4. 用Python来试试看
首先利用pip包管理工具下载identicon库
1 |
$ pip install identicon |
新建一个test.py的文件
1 |
import identicon |
在python中运行,即可得到以下图片。
是不是有点不一样?这是因为生成像素矩阵的算法不一样,有时间再研究研究吧。
参考:
[1] Mathematica实战范例:[15]Github 头像制作
Log:
2019-01-11: 上传
2019-01-09: 调试通用程序
2019-01-08: Hexo插入数学公式
2019-01-04: 调试Mathematica程序
2018-12-29: 创建
近期评论