#image #identifier #unique-identifier #unique #sortable #image-processing #filename

app ciid

ciid 是一个用于为图像推导出按时间顺序可排序的唯一标识符的实用工具。通常,数码相机和手机使用仅4位数字的序列(例如 IMG_1234.dng)来分配图像文件名。对于足够大量的图像,这些名称将很容易发生冲突。 ciid 通过从图像缓冲区推导出哈希值来解决此问题。除了能够推导出几乎不可能发生冲突的标识符外,此哈希值还可以用于以后检查图像内容的完整性。一些图像处理程序更新文件的元数据(例如内联JPEG预览、标签、修改日期)。生成的 ciid 将不受这些更改的影响,因为只有实际的图像缓冲区被哈希化。这有一个很好的副作用,即专有相机RAW文件格式和转换的 .dng 文件在大多数情况下将产生相同的标识符。以下是结果标识符的外观:01234567890123-a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1 └─────┬──────┘ └──────────────────────────────┬───────────────────────────────┘ 时间戳 哈希值(SHA-256) 标识符的第一部分编码了图像的创建日期(以毫秒精度为单位的Unix时间戳),而第二部分是基于图像缓冲区内容的哈希值。在选择标识符时考虑了以下标准:在文件系统中具有合理的字母顺序(值较高的时间戳应严格出现在值较低的之后)信息足够紧凑可以使用在URL中

3个不稳定版本

0.2.0 2020年4月22日
0.1.1 2020年3月3日
0.1.0 2020年2月20日

562 in 图像

MIT 许可证

34KB
541 代码行

ciid - 按时间顺序图像标识符

ciid 是一个用于为图像推导出按时间顺序可排序的唯一标识符的实用工具。

ciid build status ciid on crates.io

通常,数码相机和手机使用仅4位数字的序列(例如 IMG_1234.dng)来分配图像文件名。对于足够大量的图像,这些名称将很容易发生冲突。

ciid 通过从图像缓冲区推导出哈希值来解决此问题。除了能够推导出几乎不可能发生冲突的标识符外,此哈希值还可以用于以后检查图像内容的完整性。

某些图像处理程序会更新文件的元数据(例如内联JPEG预览、标签、修改日期)。由此产生的ciid将不受这些更改的影响,因为只有实际的图像缓冲区被哈希处理。这有一个很好的副作用,那就是专有相机RAW文件格式和转换后的.dng文件在大多数情况下将产生相同的标识符。

以下是如何查看结果标识符的示例

01234567890123-a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1
└─────┬──────┘ └──────────────────────────────┬───────────────────────────────┘
  timestamp                         hash of image buffer

标识符的第一部分编码了图像的创建日期(毫秒级精度的Unix时间戳),而第二部分是基于图像缓冲区内容的哈希(SHA-256)。

在选择标识符时考虑了以下标准

  • 在文件系统上有合理的字母顺序(值较高的时间戳应严格出现在值较低的之后)
  • 信息编码足够紧凑
  • 在URL中使用是安全的

安装(通过脚本)

下载并运行安装脚本

$ curl -s https://raw.githubusercontent.com/pablosichert/ciid/master/bin/install.sh | bash

安装(手动)

先决条件

有关安装依赖项的帮助,请参阅安装脚本

通过cargociid二进制文件安装到您的系统上

$ cargo install ciid

用法

$ ciid [FLAGS] <file path>...

标志

描述
-h  --help 打印帮助信息
--rename-file Renames the file to the derived identifier. Preserves the file extension
-V --version  打印版本信息
--verify-name Verifies if the provided file name is equal to the derived identifier

选项

描述
  --print <template> Prints provided template to stdout, substituting variables with file information. Available variables: ${file_path}, ${identifier}, ${date_time}, ${timestamp}
  --timestamp-digits <timestamp digits> Minimum number of digits the timestamp should carry. Will be padded with zeros from the left

参数

名称 描述
<file path>... 图像文件路径

常见问题解答

为什么不用更易于人类阅读的格式来表示时间戳?

为什么我们将时间戳编码为01234567890123而不是例如2009-02-13 23:31:30.123?时间戳代表一个明确的单一时间点,而日期字符串需要与时区关联。这意味着您要么需要在日期字符串上添加时区注释,要么每次在系统使用不同时区时更改文件名。

除此之外,以前的编码更紧凑。

尽管不幸的是,仅通过查看时间戳很难推导出实际日期,但您可以通过按值对时间戳进行排序来按时间顺序比较两个时间戳。

1忽略闰秒

变更日志

变更日志格式基于Keep a Changelog,本项目遵循语义化版本控制

[0.2.0]

变更

  • 标识符中使用的时间戳不再是使用base32编码的字节序列。相反,它使用以毫秒精度表示的Unix时间戳的普通十进制表示。这种变化的原因是文件系统UI(至少在macOS上)不会严格按照时间顺序排序文件名。例如,具有以下名称的文件:010a10a0应保持顺序,但呈现的顺序为:0a0110a0
  • 用于标识符的哈希现在使用小写十六进制编码,而不是base32,这与常见工具编码SHA-256哈希的方式一致。

添加

  • 新的命令行选项--timestamp-digits可用于控制时间戳至少应包含多少位数字。缺少的零将从左边填充。

依赖关系

~14MB
~229K SLoC