qwe*_*ymk 6 php algorithm hash
我想开发类似于jsfiddle的东西,用户可以在其中输入一些数据,然后"保存"它并获得一个加载该数据的独特随机查找URL.
我不想让保存顺序,因为我不希望任何人抓住我的所有条目,因为有些可能是私有的.但是在服务器上我想按顺序保存它.
是否存在将数字转换为具有4个字符的哈希的函数或技术,直到(62 * 62 * 62 * 62 === 14776336)条目为止没有任何冲突?
例如,服务器上的第一个条目将在服务器上命名1,但是iUew3对于用户,下一个条目将2在服务器上,但是ueGR对于用户......
编辑:我不确定它是否显而易见但这个类似哈希的函数需要是可逆的,因为当用户请求ueGR服务器需要知道服务器文件时2
可以这样做,但我建议使用64个字符,因为这将使它更容易.4个6位字符= 24位.
使用以下组合:
强烈建议使用LFSR,因为它会进行良好的加扰.其余的是可选的.所有这些操作都是可逆的,并保证每个输出都是唯一的.
当您计算"混洗"数字时,只需将其打包成二进制字符串并对其进行编码即可base64_encode.
对于解码,只需执行这些操作的反转即可.
样本(2 ^ 24长的独特序列):
function lfsr($x) {
return ($x >> 1) ^ (($x&1) ? 0xe10000 : 0);
}
function to_4($x) {
for($i=0;$i<24;$i++)
$x = lfsr($x);
$str = pack("CCC", $x >> 16, ($x >> 8) & 0xff, $x & 0xff);
return base64_encode($str);
}
function rev_lfsr($x) {
$bit = $x & 0x800000;
$x = $x ^ ($bit ? 0xe10000 : 0);
return ($x << 1) + ($bit ? 1 : 0);
}
function from_4($str) {
$str = base64_decode($str);
$x = unpack("C*", $str);
$x = $x[1]*65536 + $x[2] * 256 + $x[3];
for($i=0;$i<24;$i++)
$x = rev_lfsr($x);
return $x;
}
for($i=0; $i<256; $i++) {
$enc = to_4($i);
echo $enc . " " . from_4($enc) . "\n";
}
Run Code Online (Sandbox Code Playgroud)
输出:
AAAA 0
kgQB 1
5ggD 2
dAwC 3
DhAH 4
nBQG 5
6BgE 6
ehwF 7
HCAO 8
jiQP 9
+igN 10
aCwM 11
EjAJ 12
gDQI 13
9DgK 14
ZjwL 15
OEAc 16
qkQd 17
3kgf 18
TEwe 19
NlAb 20
pFQa 21
0FgY 22
...
Run Code Online (Sandbox Code Playgroud)
注意:对于URL替换+和/使用-和_.
注意:虽然这有效,但对于像您这样的简单场景,创建随机文件名可能更容易,直到它不存在.没有人关心参赛作品的数量.