Google Chrome использует альфу числовые хеши в качестве идентификаторов для расширений Chrome. Для, например, "ajpgkpeckebdhofmmjfgcjjiiejpodla" идентификатор для расширения Синхронизации Закладки XMarks.
Какой алгоритм используется здесь для генерации таких строк? Как они гарантируют уникальность?
Chromium генерирует id через открытый ключ. Если вы используете галерею расширений, они обрабатывают всё это за вас.
bool Extension::GenerateId(const std::string& input, std::string* output) {
CHECK(output);
if (input.length() == 0)
return false;
const uint8* ubuf = reinterpret_cast<const unsigned char*>(input.data());
SHA256Context ctx;
SHA256_Begin(&ctx);
SHA256_Update(&ctx, ubuf, input.length());
uint8 hash[Extension::kIdSize];
SHA256_End(&ctx, hash, NULL, sizeof(hash));
*output = StringToLowerASCII(HexEncode(hash, sizeof(hash)));
ConvertHexadecimalToIDAlphabet(output);
return true;
}
Взгляните на файл extension.cc, в нём есть более подробная информация, такая как генерация exncoding/decoding файла .pem и т.д.
.Похоже, что копия только обрабатывает отдельные файлы . Вот функция для рекурсивного копирования я нашел в этой заметке на странице копирования документации :
<?php
function recurse_copy($src,$dst) {
$dir = opendir($src);
@mkdir($dst);
while(false !== ( $file = readdir($dir)) ) {
if (( $file != '.' ) && ( $file != '..' )) {
if ( is_dir($src . '/' . $file) ) {
recurse_copy($src . '/' . $file,$dst . '/' . $file);
}
else {
copy($src . '/' . $file,$dst . '/' . $file);
}
}
}
closedir($dir);
}
?>
-121--3473510- Спасибо за ответы. Я чувствую, что каждый ответ был частью ответа. Вот что я искал. Символ
? является просто кратким для (something 'start) . Таким образом, (a 'start) можно переписать как a? . Таким образом, пример становится:
b * (abb *) * a?
В питоне мы бы написали:
p = re.compile (r '^ b * (abb *) * a? $')
Прямая трансляция синтаксиса регулярного регулярного выражения в python (т.е. копирование и вставка) не работает, потому что python соответствует самой короткой подстроке (если символы $ или ^ отсутствуют), в то время как теоретические регулярные выражения соответствуют самой длинной начальной подстроке .
Так, например, если у нас была последовательность:
s = 'aa'
Наш учебник regex b * (abb *) * a? не будет соответствовать ему, потому что у него есть два а. Однако если скопировать его прямо в python:
> > p = re.compile (r 'b * (abb *) * a?')
> > bool (p.match (s))
Правда
Это происходит потому, что наш регекс соответствует только подстроке «a» нашей последовательности «aa».
Для того, чтобы сказать Питону, чтобы сделать совпадение в целом ряде мы должны сказать ему, где начало и конец последовательности, с ^ и $ соответственно:
> > p = re.compile (r '^ b * (abb *) * a? $')
> > bool (p.match (s))
Ложный
Обратите внимание, что python regex match () совпадает с началом последовательностей, поэтому он автоматически принимает ^ в начале. Однако функция search () не выполняет, и поэтому мы сохраняем ^ .
Так например:
> > s = 'aa'
> > p = re.compile (r 'b * (abb *) * a? $')
> > bool (p.match (s))
Ложь # Правильно
> > bool (p.search (s))
True # Неверно - поиск проигнорировал первый «» а
Если быть точным, это первые 128 битов SHA256 открытого ключа RSA, закодированного в базовом 16.
Другая случайная часть мелочей - то, что кодирование использует a-p вместо 0-9a-f. Причина заключается в том, что ведущие числовые символы в поле хоста происхождения могут выводиться Chrome рассматривать в качестве потенциальных IP-адресов. Мы называем его внутренне «mpdecimal» после парня, который его придумал.
Я опубликовал короткий скрипт Ruby для расчета идентификатора расширения от закрытого ключа: http://supercollider.dk/2010/01/calculation-chroome-extion-id -Из-ваше-частное ключ-233 . Это в значительной степени следует описать erik Kay в формате.