У меня есть приложение Android, которое использует алгоритм FNV для отслеживания определенных состояний приложения. Время от времени мне приходится запускать приложение с моих серверов и указывать ему выполнять определенные действия для определенных состояний c приложения. Я использую PHP в качестве языка сценариев на стороне сервера. По моему опыту, кодирование ваших собственных хешей в PHP и последующее ожидание тех же значений, которые генерируются, скажем, Java, непросто. Чтобы убедиться, что я отправляю правильные FNV, я выбрал сгенерировать ha sh в Java и затем вызвать его из PHP. Вот что я сделал
Сначала мой Java код
public class fnv64
{
private static Long fnv_64(String value)
{
byte[] data = value.getBytes();
Long hash = 0xcbf29ce484222325L;
int len = data.length;
for (int i = 0;i < len;i++)
{
hash ^= (data[i] & 0xff);
hash *= 0x100000001b3L;
}
return hash;
}
public static void main(String[] args)
{
String raw = args[0];
System.out.println(fnv_64(raw));
}
}
Простой javac /path/to/fnv64.java
Позже у меня есть необходимый fnv64.class
файл, скомпилированный и доступный. Для удобства я запустил fnv64. java изнутри VSCode, чтобы убедиться, что он действительно возвращает результат.
Теперь вот пример PHP кода, из которого все это называется
<?php
header("HTTP/1.1 200 OK");
$headers = getallheaders();
$subscribing = ('sub' == $headers['X-Reason']);
$rawZuff = $headers['X-Channel-Id'];
trigger_error($rawZuff);
$zuffHash = shell_exec("java -cp .:/var/www/html/pubsub/fnv64 ".$rawZuff);
trigger_error($zuffHash);
?>
Когда я получаю доступ к этому сценарию из своего браузера - ну, на самом деле, к нему обращается клиент WebSocket, - а затем проверяет файл журнала, который я вижу, $rawZuff
сообщил там, как и ожидалось. Howeverr, то второе утверждение ошибки упорно остается пустым - это как бы * программа * 1028 никогда не был бежать или не возвращается никакого результата
1015 * Очевидно, что я делаю что-то здесь не так.. Я был бы очень признателен всем, кто мог бы сказать мне, что это может быть.