Что нового

уникальный идентификатор файла (jpg, png)

saraconor

Новичок
Сообщения
416
Репутация
3
Есть ли в файлах формата jpg, png уникальный идентификатор? (не имя файла, не подпись в EXIF данных, а некий внутренний номер) И если есть, как можно его быстро получить?
Если нет, то как можно быстро его создать? Планирую потом использовать идентификатор в массиве для поиска нужного файла.
Я это вижу так: открываем файл с картинкой, копируем определенные строки, объединяем их -получаем уникальный код. Может есть решение проще и быстрее?
п.с. идентификатор нужен потому что некоторые файлы могут иметь одинаковое назвние при этом разную картинку.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
да, называется контрольная сумма, хэш итп.
 
Автор
S

saraconor

Новичок
Сообщения
416
Репутация
3
Код:
#include <Hash.au3>
$MyFile = 'путь к файлу'
$HashedData = ObjCreate("CAPICOM.HashedData.1")
$HashedData.Algorithm() = 3 ; MD5
$hFile = FileOpen($MyFile, 16)
$binary = FileRead($hFile)
FileClose($hFile)
MsgBox(0, '', $HashedData.Hash($binary))

В четвертой строке ошибка "Variable must be of type "Object"."
В чем может быть проблема? (Autoit 3.3.8.1)
 

Вложения

  • Hash.au3
    13.6 КБ · Просмотры: 11

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Как было бы здорово, если бы все умели выражать свои мысли...

saraconor, я не представляю, что вам нужно, но есть такое понятие как сигнатура файла. Это произвольное количество байт, которое расположено в определенном месте (как правило в начале файла) и однозначно идентифицирует тип файла. Список сигнатур для известных типов файлов ищите в Google.

Что касается хэша, то он однозначно идентифицирует именно данный файл. Но в этом случае проще использовать тот же EXIF, разницы не будет.
 
Автор
S

saraconor

Новичок
Сообщения
416
Репутация
3
Yashied сказал(а):
Как было бы здорово, если бы все умели выражать свои мысли...

saraconor, я не представляю, что вам нужно, но есть такое понятие как сигнатура файла. Это произвольное количество байт, которое расположено в определенном месте (как правило в начале файла) и однозначно идентифицирует тип файла. Список сигнатур для известных типов файлов ищите в Google.
Нужен не тип файла а именно УНИКАЛЬНЫЙ идентификатор файла, больше всего на это подходит "хэш" А количество байт может быть и одинаковым при разных картинках.
Подскажите, как можно быстро вычислить хэш файла? пример наверху не работает.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Зачем вам хэш, используйте EXIF.


Добавлено:
Сообщение автоматически объединено:

Для относительно небольших файлов я использую следующую функцию:

Код:
Func _Hash($sFile)

	Local $hFile, $bData, $tData, $iSize, $iByte, $Error = True

	Do
		$hFile = _WinAPI_CreateFileEx($sFile, $OPEN_EXISTING, $GENERIC_READ, BitOR($FILE_SHARE_READ, $FILE_SHARE_WRITE))
		If @Error Then
			$hFile = Null
			ExitLoop
		EndIf
		$iSize = _WinAPI_GetFileSizeEx($hFile)
		If @Error Then
			ExitLoop
		EndIf
		$tData = DllStructCreate('byte[' & $iSize & ']')
		If Not _WinAPI_ReadFile($hFile, DllStructGetPtr($tData), $iSize, $iByte) Then
			ExitLoop
		EndIf
		$Error = 0
	Until 1
	If $hFile Then
		_WinAPI_CloseHandle($hFile)
	EndIf
	If $Error Then

	Else
		$bData = _WinAPI_HashData(DllStructGetPtr($tData), $iSize)
		If @Error Then

		Else
			Return $bData
		EndIf
	EndIf
	Return SetError(1, 0, Binary(''))
EndFunc   ;==>_Hash
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Можете использовать еще _Crypt_HashFile(), но я не уверен, что она работает быстрее _Hash(). Как вариант, можно тупо в конец файла дописывать свою информацию, типа EXIF.
 
Автор
S

saraconor

Новичок
Сообщения
416
Репутация
3
Yashied сказал(а):
Можете использовать еще _Crypt_HashFile(), но я не уверен, что она работает быстрее _Hash(). Как вариант, можно тупо в конец файла дописывать свою информацию, типа EXIF.
Угадали) для png сейчас как раз и реализована допись в конец файла. Но все равно быстрее работать с текстовым файлом где массив с идентификаторами чем кадый файл открывать и считывать данные. Подскажите, а почему ошибка возникает в _Hash() ? (пример наверху)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
saraconor сказал(а):
Подскажите, а почему ошибка возникает в _Hash() ? (пример наверху)
Если про мой _Hash(), то нужно вначале дописать:

Код:
#Include <APIConstants.au3>
#Include <WinAPIEx.au3>
 
Автор
S

saraconor

Новичок
Сообщения
416
Репутация
3
В вашем _Hash ошибка в строке "$hFile = Null"
И очевидно это не весь код? Где вывод в текст результата?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
saraconor сказал(а):
В вашем _Hash ошибка в строке "$hFile = Null"
И очевидно это не весь код? Где вывод в текст результата?
Разговор окончен.
 
Автор
S

saraconor

Новичок
Сообщения
416
Репутация
3
Код:
#include <Crypt.au3>

_Crypt_Startup()
$bHash = FileOpenDialog("Open a file", "", "All files (*.*)")
$bHash2 = _Crypt_HashFile($bHash, $CALG_SHA1) ; Create a hash of the file.
MsgBox(0, '', $bHash2)
_Crypt_Shutdown() ; Shutdown the crypt library.


Вот, алилуя! то что нужно, быстро работает, малый размер кода.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
586.gif
 
Верх