底线:在我的网站上可以上传图片。这样当多次下载相同的图像到不同的相册时,不会浪费硬盘空间,所有下载都会计算 SHA1,服务器会检查目录中是否存在与接收到的哈希名称相同的文件。如果文件存在,则简单地附加一个链接,如果不存在,则将其与其哈希名称一起保存。一切都很好,但是 SHA1 结果对于地址栏来说相当长,并且计算需要很多时间。我想将名称减半,加快计算速度,但仍要消除匹配冲突的可能性。因此,md5,甚至校验和,都消失了。有一个想法是通过取散列字符串的后半部分来截断 SHA1 本身,但这并不能解决速度问题。那么,该采用什么算法呢?
arelive's questions
有四张桌子。合二为一 - 有关图像作为文件的数据:
CREATE TABLE public.images (
id bigserial NOT NULL PRIMARY KEY,
hash character(50) NOT NULL,
type public.image_type NOT NULL,
uploader_type public.entity_type NOT NULL,
uploader_id bigint NOT NULL,
uploader_ip inet NOT NULL
);
在其他 - 用户相册中:
CREATE TABLE public.albums (
id bigserial NOT NULL PRIMARY KEY,
access public.access DEFAULT 'private'::public.access NOT NULL,
name text NOT NULL,
description text DEFAULT ''::text,
owner_type public.entity_type NOT NULL,
owner_id bigint NOT NULL,
poster_image_id bigint,
comments public.access DEFAULT 'public'::public.access NOT NULL,
anonymous_comments_only boolean DEFAULT false NOT NULL
);
第三个连接第一个和第二个。也就是说,如果 images 是关于图像文件的信息,那么下表表示哪些相册有哪些图像:
CREATE TABLE public.album_images (
id bigserial NOT NULL PRIMARY KEY,
album_id bigint NOT NULL,
image_id bigint NOT NULL,
sha1 character(40) NOT NULL,
owner_type public.entity_type NOT NULL,
owner_id bigint NOT NULL,
description text NOT NULL,
last_comment_number bigint DEFAULT 0 NOT NULL,
saved timestamp without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL
);
这里 sha1 与图像中的散列不同。理论上,需要通过图像和描述过滤掉重复项。
而第四张表是图片的好恶,表示为“评分”(评分布尔字段似乎是喜欢或不喜欢):
CREATE TABLE public.media_ratings (
id bigserial NOT NULL PRIMARY KEY,
media_type public.media_type NOT NULL,
media_id bigint NOT NULL,
user_id bigint NOT NULL,
rating boolean NOT NULL,
datetime timestamp without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL
);
我正在进行查询以确定相册中最喜欢的三张图片。即我选择相册的所有者、相册本身和图片信息,按album_images.id分组,然后按好恶差排序,将结果限制为三行。像这样:
SELECT a.owner_type, a.owner_id, a.name, i.hash, i.type
FROM albums a
JOIN album_images ai ON a.id = ai.album_id
JOIN images i ON i.id = ai.image_id
JOIN media_ratings mr ON mr.media_id = ai.id
GROUP BY ai.id
ORDER BY ( COUNT(mr.rating = true) - COUNT(mr.rating = false) ) DESC
LIMIT 3;
我得到的是一个错误:column "a.owner_type" must appear in the GROUP BY clause or be used in an aggregate function
. 如果您将 a.owner_type 添加到 GROUP BY,它将开始按顺序对所有其他可选字段发誓,直到我将它们全部分组。但是我只需要按相册中的图像进行分组,因为我担心如果我填写 GROUP BY 中的所有字段,所需的结果会中断。stackoverflow 上有类似的问题,建议添加 DISTINCT。添加,不犁。该怎么办?
我正在编写一个跨平台库。代码会被不同的编译器针对不同的平台编译,可能有些不支持64位整数。我想通过预处理器指令使用它们来处理代码的关键部分,但我该怎么做呢?有什么方法#ifdef __LONG_LONG_INT_T__
可以知道编译器是否支持特定的原始类型?
问题在标题中。如果我在英文原文的底部加上license的翻译成一些欧洲和亚洲的语言,会不会失去法律效力?也有带有翻译的单独文件,它们位于目录/i18n/LANG
中,其中LANG
是语言的自名,但LICENSE
感兴趣的是根目录中的文件国际化的可能性。
在 Mint 19 上再次 apt-get upgrade 和 apt-get autoremove 后,发现 dpkg 无法配置轴映像更新包。更准确地说,我无法删除旧的 linux-image-4.15.0-66-generic。当我再次运行升级时,我得到了这个:
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
Расчёт обновлений… Готово
Следующий пакет устанавливался автоматически и больше не требуется:
shim
Для его удаления используйте «sudo apt autoremove».
Следующие пакеты будут УДАЛЕНЫ:
linux-image-4.15.0-66-generic
Следующие пакеты будут оставлены в неизменном виде:
fwupd fwupdate fwupdate-signed linux-generic linux-headers-generic linux-image-generic
Следующие пакеты будут обновлены:
code linux-base
Обновлено 2 пакетов, установлено 0 новых пакетов, для удаления отмечено 1 пакетов, и 6 пакетов не обновлено.
Установлено или удалено не до конца 5 пакетов.
Необходимо скачать 0 B/62,3 MB архивов.
После данной операции объём занятого дискового пространства уменьшится на 8 394 kB.
Хотите продолжить? [Д/н] y
Предварительная настройка пакетов ...
(Чтение базы данных … на данный момент установлено 410706 файлов и каталогов.)
Удаляется linux-image-4.15.0-66-generic (4.15.0-66.75) …
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-66-generic
/etc/kernel/postrm.d/zz-update-grub:
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/50_linuxmint.cfg'
Генерируется файл настройки grub …
Найден образ linux: /boot/vmlinuz-4.15.0-76-generic
Найден образ initrd: /boot/initrd.img-4.15.0-76-generic
Найден образ linux: /boot/vmlinuz-4.15.0-72-generic
Найден образ initrd: /boot/initrd.img-4.15.0-72-generic
Найден образ linux: /boot/vmlinuz-4.15.0-70-generic
Найден образ initrd: /boot/initrd.img-4.15.0-70-generic
Найден образ linux: /boot/vmlinuz-4.15.0-20-generic
Найден образ initrd: /boot/initrd.img-4.15.0-20-generic
Найден образ linux: /boot/vmlinuz-4.15.0-76-generic
Найден образ initrd: /boot/initrd.img-4.15.0-76-generic
Найден образ linux: /boot/vmlinuz-4.15.0-72-generic
Найден образ initrd: /boot/initrd.img-4.15.0-72-generic
Найден образ linux: /boot/vmlinuz-4.15.0-70-generic
Найден образ initrd: /boot/initrd.img-4.15.0-70-generic
Найден образ linux: /boot/vmlinuz-4.15.0-20-generic
Найден образ initrd: /boot/initrd.img-4.15.0-20-generic
Добавление записи в загрузочное меню для конфигурации с микропрограммой EFI
ошибка: syntax error.
ошибка: Incorrect command.
ошибка: syntax error.
Синтаксическая ошибка в строке 138
В сгенерированном файле настроек GRUB обнаружены синтаксические ошибки.
Убедитесь, что в файлах /etc/default/grub
и /etc/grub.d/* ошибки отсутствуют или пошлите сообщение об ошибке
в прикреплённым файлом /boot/grub/grub.cfg.new.
run-parts: /etc/kernel/postrm.d/zz-update-grub exited with return code 1
dpkg: ошибка при обработке пакета linux-image-4.15.0-66-generic (--remove):
installed linux-image-4.15.0-66-generic package post-removal script subprocess returned error exit status 1
При обработке следующих пакетов произошли ошибки:
linux-image-4.15.0-66-generic
E: Sub-process /usr/bin/dpkg returned an error code (1)
我使用 grub-mkconfig 手动配置了 grub,但 dpkg 固执地按照他的方式进行了配置。当我查看他生成的配置的第 138 行时,是这样的:
### BEGIN /etc/grub.d/40_custom_proxy ###
menuentry "Linux Mint" --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-f034ca3a-4301-49a0-8ca3-148874a7e419' {
} # ЭТО 138 СТРОКА
### END /etc/grub.d/40_custom_proxy ###
我怀疑花括号块中应该有一些指示,就像其他块一样,但是如何获得它们呢?没有注释的 /etc/default/grub 文件如下所示:
GRUB_DEFAULT="0"
GRUB_TIMEOUT_STYLE="hidden"
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR="`lsb_release -i -s 2> /dev/null || echo Debian`"
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
和 /ect/default/grub.d//etc/default/grub.d/50_linuxmint.cfg 像这样:
set -e
GRUB_DISTRIBUTOR="Ubuntu"
问题是现在 dpkg 尝试使用任何 apt 操作删除旧的 linux 映像,无论是升级、删除还是安装,所以现在我根本无法使用包管理器。有什么方法可以让 dpkg 忘记这个图像而不尝试配置 grub?事实上,我不需要鹅耳枥,计算机立即加载带有 Linux 的部分。