Почему не работает мой порт java-класса на php?

394
19 августа 2021, 12:00

Есть небольшой класс на java:

import java.security.SecureRandom;
public class guidGenerator {
private long clockWall;
guidGenerator(long clockWall) {
    this.clockWall = clockWall; 
}
private void append(final long n, int i, final byte[] array, int n2) {
    --i;
    while (i >= 0) {
        final byte b = (byte)(n >> i * 4 & 0xFL);
        final int n3 = n2 / 2;
        if (n2 % 2 == 0) {
            array[n3] = (byte)(b << 4);
        }
        else {
            array[n3] |= b;
        }
        --i;
        ++n2;
    }
}
private static long toLong(final byte[] array, int i, final int j) {
    final int n = i + j;
    if (n <= array.length) {
        long n2 = 0L;
        while (i < n) {
            n2 = (n2 << 8 | ((long)array[i] & 0xFFL));
            ++i;
        }
        return n2;
    }
    final StringBuilder sb = new StringBuilder();
    sb.append("(start: ");
    sb.append(i);
    sb.append("+ count: ");
    sb.append(j);
    sb.append(") should NOT be larger than bytes.length");
    throw new IllegalStateException(sb.toString());
}
public byte[] generateBytes() {
    final SecureRandom secureRandom = new SecureRandom();
    final long instant = this.clockWall;
    final byte[] bytes = new byte[9];
    secureRandom.nextBytes(bytes);
    final long long1 = toLong(bytes, 0, 6);
    final long long2 = toLong(bytes, 6, 3);
    final byte[] array = new byte[16];
    this.append(0xFFFFFFFFL & instant, 8, array, 0);
    this.append(0xFFFL & instant >> 32, 3, array, 8);
    this.append(long1, 12, array, 11);
    this.append(0L, 1, array, 23);
    this.append(1L, 2, array, 24);
    this.append(long2, 6, array, 26);
    return array;
}
public static String asHexString(final byte[] array) {
    final int length = array.length;
    final StringBuilder sb = new StringBuilder(length * 2);
    for (int i = 0; i < length; ++i) {
        sb.append("0123456789abcdef".charAt(array[i] >> 4 & 0xF));
        sb.append("0123456789abcdef".charAt(array[i] & 0xF));
    }
    return sb.toString();
}
public String generateHexString() {
    return guidGenerator.asHexString(this.generateBytes());
}

}

Нужно портировать его на php. Вот как я это делаю:

<?php
class guidGenerator {
private $clockWall;
public function __construct() {
    $this->clockWall = $this->clockWall();
}
// timestamp in ms
private function clockWall() {
    return round(microtime(true) * 1000);
}
private function append($n, $i, $array, $n2) {
    --$i;
    while($i >= 0) {
        $b = ((($n >> ($i * 4)) & 0xF));
        $n3 = ($n2 / 2);
        if (($n2 % 2) == 0) {
            $array[$n3] = ($b << 4);
        } else {
            $array[$n3] |= $b;
        }
        --$i;
        ++$n2;
    }
}
public static function toLong($array, $i, $j) {
    $n = ($i + $j);
    if($n <= count($array)) {
        $n2 = 0;
        while($i < $n) {
            $n2 = ((($n2 << 8) | (($array[$i] & 0xFF))));
            ++$i;
        }
        return $n2;
    }
    echo "(start: {$i} + count: {$j}) should NOT be larger than bytes.length\n";
}
public function generateBytes() {
    $instant = $this->clockWall;
    $bytes = unpack('C*', random_bytes(9));
    $long1 = ebayGuidGenerator::toLong($bytes, 0, 6);
    $long2 = ebayGuidGenerator::toLong($bytes, 6, 3);
    $array = [];
    $this->append((0xFFFFFFFF & $instant), 8, $array, 0);
    $this->append((0xFFF & ($instant >> 32)), 3, $array, 8);
    $this->append($long1, 12, $array, 11);
    $this->append(0, 1, $array, 23);
    $this->append(1, 2, $array, 24);
    $this->append($long2, 6, $array, 26);
    return $array;
}
public static function asHexString($array) {
    $length = count($array);
    $sb = '';
    $hex = '0123456789abcdef';
    for($i = 0; $i < $length; ++$i) {
        $sb .= $hex{$array[$i] >> 4 & 0xF};
        $sb .= $hex{$array[$i] & 0xF};
    }
    return $sb;
}
public function generateHexString() {
    return guidGenerator::asHexString($this->generateBytes());
}

}

Но мой порт почему-то не работает как нужно... Где я допустил ошибку? А то несколько часов уже голову ломаю что не так в моём коде...

READ ALSO
Поможет ли мне Apache Spark?

Поможет ли мне Apache Spark?

У меня есть база данных MySQL с большими таблицами (~4-20G) и сервер Tableau для аналитиковЗапросы с Tableau работают слишком медленно

155
Регулярные выражения Java, выбор из строки

Регулярные выражения Java, выбор из строки

Можно из такой строки: 548673++++++1028 809216 /RU/CARD2CARD ALFA_MOBILE>MOSCOW 3105

282
Регистр первого символа каждого слова, которое состоит из трех и более символов, должен быть интвертирован. Как сделать чтоб работало и с кириллицей?

Регистр первого символа каждого слова, которое состоит из трех и более символов, должен быть интвертирован. Как сделать чтоб работало и с кириллицей?

Слово следует рассматривать как последовательность, содержащую только буквы (все остальные символы не являются частью слово)Например: Вход:

245
Полиморфизм и позднее связывание в Java

Полиморфизм и позднее связывание в Java

У Эккеля есть замечательный пример полиморфизма:

299