我想知道Instapaper(保存文本的书签)如何为他们的书签生成URL。
我的脚本src类似于www.instapaper.com/j/AnJHrfoDTRia
这些网址的质量是他们需要永远不会发生冲突,而且无法猜测(因此其他人无法保存到您的帐户中)。
我知道一个简单的方法可能是MD5他们的电子邮件地址(假设已经注册了注册的唯一性),但后来我最终得到了一个超长字符串。这不是一个大问题,但我想知道哪些技术对于不会经常发生冲突的较短GUID(这显然是权衡,但我认为上面的12个字符相当短)
答案 0 :(得分:2)
您可以通过将MD5哈希值视为基数16(使用字符(0-9a-f)并将其转换为例如base 36)来获得更短的字符串。
<?php
function gmp_convert($num, $base_a, $base_b) {
return gmp_strval (gmp_init($num, $base_a), $base_b );
}
$hash = md5("hello");
$hash2 = gmp_convert($hash,16,36);
echo "$hash <br>"; //5d41402abc4b2a76b9719d911017c592
echo $hash2; //5ir3t0ozoelrnauhrwyu1xfgy
您提到的链接似乎使用了所有字母(大写和小写)。
中提取的信息答案 1 :(得分:0)
<?php
$length = 12;
$chars = array_merge(range(0, 9), range('a', 'z'), range('A', 'Z'));
$hash = '';
for ($i = 0; $i < $length; $i++) {
$hash .= $chars[array_rand($chars)];
}
var_dump($hash);
这将给我们3226266762397899821056独特的组合vs 281474976710656 for md5( 1100万倍大)。
对于4个字符(!!!),这将是14776336个独特的组合,这对您来说已经足够了。
答案 2 :(得分:0)
Base64对加密强大的随机数进行编码。
<?php
// get 72 pseudorandom bits in a base64 string of 12 characters
$pr_bits = '';
// Unix/Linux platform?
$fp = @fopen('/dev/urandom','rb');
if ($fp !== FALSE) {
$pr_bits .= @fread($fp,9);
@fclose($fp);
}
// MS-Windows platform?
if (@class_exists('COM')) {
// http://msdn.microsoft.com/en-us/library/aa388176(VS.85).aspx
try {
$CAPI_Util = new COM('CAPICOM.Utilities.1');
$pr_bits .= $CAPI_Util->GetRandom(9,0);
// if we ask for binary data PHP munges it, so we
// request base64 return value. We squeeze out the
// redundancy and useless ==CRLF by hashing...
if ($pr_bits) { $pr_bits = substr(md5($pr_bits,TRUE), 0, 9); }
} catch (Exception $ex) {
// echo 'Exception: ' . $ex->getMessage();
}
}
$uid = base64_encode($pr_bits);
?>
这将为您提供72位最纯正的哥伦比亚人,共12个字符。该集合包含大约10 ^ 21个数字。这意味着在100万用户之后碰撞的可能性大约是十亿分之一。
这是对此stackoverflow答案的一个非常小的修改,用于生成加密真棒:Secure random number generation in PHP。
答案 3 :(得分:-2)
MD5用户名。获取生成的MD5哈希的前X个字符。检查数据库中是否已存在具有该值的url标记。如果是这样,请取第一个X + 1个字符并尝试(依此类推)。如果没有,那么您拥有该用户的令牌。将令牌存储在数据库中并从现在开始查找它 - 不要尝试每次或多数情况下从用户名重新创建令牌。
你可能从X = 7开始并且做得很好(绝大多数令牌代都不会超过1-2次)。
此外,您可能希望在哈希计算中添加其他内容(例如,它们或随机数),以便更难预测给定用户的令牌。