blob: 831ab83572ad97a6c3dd4c366fea7dca2cbc9d23 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Security.Cryptography;
using System.Threading;
namespace Org.Apache.Rocketmq
{
public static class Utilities
{
private static long _instanceSequence = 0;
private static readonly int ProcessId = Process.GetCurrentProcess().Id;
private static readonly string HostName = System.Net.Dns.GetHostName();
private static readonly byte[] RandomMacAddressBytes =
Enumerable.Range(0, 6).Select(_ => (byte)new Random().Next(256)).ToArray();
private static readonly ThreadLocal<MD5> Md5 = new ThreadLocal<MD5>(MD5.Create);
private static readonly ThreadLocal<SHA1> Sha1 = new ThreadLocal<SHA1>(SHA1.Create);
public const int MasterBrokerId = 0;
public static int GetPositiveMod(int k, int n)
{
var result = k % n;
return result < 0 ? result + n : result;
}
public static byte[] GetMacAddress()
{
var nics = NetworkInterface.GetAllNetworkInterfaces().Where(
x => x.NetworkInterfaceType != NetworkInterfaceType.Loopback &&
(int)x.NetworkInterfaceType != 53);
var nic = nics.FirstOrDefault(x => x.OperationalStatus == OperationalStatus.Up) ??
nics.FirstOrDefault(x => x.OperationalStatus == OperationalStatus.Unknown) ??
nics.FirstOrDefault();
if (nic == null) { return RandomMacAddressBytes; }
var mac = nic.GetPhysicalAddress().GetAddressBytes();
return mac.Length < 6 ? mac : RandomMacAddressBytes;
}
public static int GetProcessId()
{
return ProcessId;
}
public static string GetHostName()
{
return HostName;
}
public static string GetClientId()
{
var hostName = System.Net.Dns.GetHostName();
var pid = Process.GetCurrentProcess().Id;
var index = Interlocked.Increment(ref _instanceSequence);
var nowMillisecond = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds;
var no = DecimalToBase36(nowMillisecond);
return $"{hostName}@{pid}@{index}@{no}";
}
#if NET5_0_OR_GREATER
public static string ComputeMd5Hash(byte[] data)
{
var hashBytes = Md5.Value.ComputeHash(data);
return Convert.ToHexString(hashBytes);
}
public static string ComputeSha1Hash(byte[] data)
{
var hashBytes = Sha1.Value.ComputeHash(data);
return Convert.ToHexString(hashBytes);
}
#else
public static string ComputeMd5Hash(byte[] data)
{
var hashBytes = Md5.Value.ComputeHash(data);
return BitConverter.ToString(hashBytes).Replace("-", "");
}
public static string ComputeSha1Hash(byte[] data)
{
var hashBytes = Sha1.Value.ComputeHash(data);
return BitConverter.ToString(hashBytes).Replace("-", "");
}
#endif
private static string DecimalToBase36(long decimalNumber)
{
const string chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string result = string.Empty;
while (decimalNumber > 0)
{
result = chars[(int)(decimalNumber % 36)] + result;
decimalNumber /= 36;
}
return result;
}
public static string ByteArrayToHexString(byte[] bytes)
{
var result = new StringBuilder(bytes.Length * 2);
const string hexAlphabet = "0123456789ABCDEF";
foreach (var b in bytes)
{
result.Append(hexAlphabet[(int)(b >> 4)]);
result.Append(hexAlphabet[(int)(b & 0xF)]);
}
return result.ToString();
}
public static byte[] CompressBytesGzip(byte[] src, CompressionLevel level)
{
using (var ms = new MemoryStream())
{
using (var gzip = new GZipStream(ms, level))
{
gzip.Write(src, 0, src.Length);
}
return ms.ToArray();
}
}
public static byte[] DecompressBytesGzip(byte[] src)
{
var inputStream = new MemoryStream(src);
var gzipStream = new GZipStream(inputStream, CompressionMode.Decompress);
var outputStream = new MemoryStream();
gzipStream.CopyTo(outputStream);
return outputStream.ToArray();
}
}
}