Как использовать строковый хэш более одного раза? - PullRequest
0 голосов
/ 04 августа 2010

Мое приложение генерирует множество изображений, и, чтобы сэкономить память, я записываю эти файлы во временный каталог и читаю их при необходимости.Я записываю две версии одного и того же изображения в папку tmp, одну версию в виде миниатюр с меньшим разрешением, а другую - в полный размер.Чтобы сделать имена файлов непредсказуемыми, я добавляю хеш строки в конце.

Например, я хочу иметь два изображения, одно из которых называется "ThumbnailImage.fgl8bda", а другое - "FullImage.fgl8bda"

* 1004.* Это код, который я использую:
NSString *fileName = @"Image.XXXXXXX";
NSString *thumbName = [@"Thumbnail" stringByAppendingFormat:@"%@", fileName];
NSString * thumbPath = [self writeToTempFile:thumbNailImage andName: thumbName];

NSString *fullName = [@"Full" stringByAppendingFormat:@"%@", fileName];
NSString *fullPath = [self writeToTempFile:fullImage andName: fullName];

Однако два файла имеют разные имена, то есть каждый раз, когда я использую переменную fileName, хеш регенерируется.Например, два моих изображения называются «ThumbnailImage.jhu078l» и «FullImage.ksi9ert».

Есть идеи, как использовать один и тот же хэш несколько раз?

Ответы [ 4 ]

2 голосов
/ 04 августа 2010

Как правило, повторно использовать суффикс временного имени файла небезопасно, поскольку, даже если вы можете убедиться, что A.ashkjd не существует, существует вероятность, что B.ashkjd занят.

Вы можете создать папкуи сохраните в нем два изображения, например,

char tmpl[] = "Image.XXXXXX";
char* res = mkdtemp(tmpl);
if (res != NULL) {
   NSString* dirName = [NSString stringWithUTF8String:res];
   NSString* thumbPath = [dirName stringByAppendingPathComponent:@"Thumbnail.png"];
   [thumbImage writeToFile:thumbPath atomically:YES];
   NSString* fullPath = [dirName stringByAppendingPathComponent:@"Full.png"];
   [fullImage writeToFile:fullPath atomically:YES];
}

(Примечание. Вам необходимо удалить папку вручную.)

1 голос
/ 04 августа 2010

@ У Кенни есть правильное решение, но он не объяснил причину.

writeToTempFile не использует хеш для заполнения уникальной части имени. Вместо этого он использует новую уникальную случайную строку для каждого вызова.

0 голосов
/ 04 августа 2010

@ TimG

Это не имеет значения.Это тоже заканчивается разными именами.

Когда я пишу

NSString *fileName = @"Image.XXXXXXX";

Часть XXXXXXX fileName заменяется на 7 случайных символов, поэтому имена файлов не могут быть предсказуемыми.

Приветствия

0 голосов
/ 04 августа 2010

Я новичок в objc, поэтому извиняюсь, если это глупое предложение.Что произойдет, если вы используете stringByAppendingString вместо description, который вы вызываете:

NSString *thumbName = [@"Thumbnail" stringByAppendingString:fileName];

Я не понимаю, почему эти два не эквивалентны для этого использования,но все же.

Кроме того, как / где вы генерируете хеш?

EDIT

@ ar06 Я думаю, что вы говорите, что ваш (я предполагаю, что это ваш) Метод writeToTempFile выполняет замену XXXXX 'в параметре fileName на случайное значение.Если это так, то есть ваша проблема - он генерирует новое случайное число каждый раз, когда он вызывается, и вы вызываете его дважды.Размещенный вами фрагмент кода работает, потому что fileName является неизменным;он будет сохранен с расширением «XXXXX».

Вам нужно обратиться к этим случайным суффиксам позже?Какой бы механизм вы не использовали для их отслеживания, writeToTempFile может также использовать его для прикрепления одного и того же значения к большому пальцу и к полному размеру.

FWIW Я согласен, что подход Кенни лучше, поскольку вы не можете гарантировать уникальность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...