雪花算法golang实现
发布时间:2021-12-16 编辑:jiaochengji.com
教程集为您提供雪花算法golang实现等资源,欢迎您收藏本站,我们将为您提供最新的雪花算法golang实现资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg>
package main
<pre class="prettyprint"><code class=" hljs cs"><span class="hljs-comment">// twitter 雪花算法</span> <span class="hljs-comment">// 把时间戳,工作机器ID, 序列号组合成一个 64位 int</span> <span class="hljs-comment">// 第一位置零, [2,42]这41位存放时间戳,[43,52]这10位存放机器id,[53,64]最后12位存放序列号</span></code></pre> <pre class="prettyprint"><code class=" hljs go"><span class="hljs-keyword">import</span> ( <span class="hljs-string">"time"</span> <span class="hljs-string">"fmt"</span> ) <span class="hljs-keyword">var</span> ( machineID <span class="hljs-typename">int64</span> <span class="hljs-comment">// 机器 id 占10位, 十进制范围是 [ 0, 1023 ]</span> sn <span class="hljs-typename">int64</span> <span class="hljs-comment">// 序列号占 12 位,十进制范围是 [ 0, 4095 ]</span> lastTimeStamp <span class="hljs-typename">int64</span> <span class="hljs-comment">// 上次的时间戳(毫秒级), 1秒=1000毫秒, 1毫秒=1000微秒,1微秒=1000纳秒</span> ) <span class="hljs-keyword">func</span> init() { lastTimeStamp = time.Now().UnixNano() /<span class="hljs-number"> 1000000</span> } <span class="hljs-keyword">func</span> SetMachineId(mid <span class="hljs-typename">int64</span>) { <span class="hljs-comment">// 把机器 id 左移 12 位,让出 12 位空间给序列号使用</span> machineID = mid <<<span class="hljs-number"> 12</span> }</code></pre> <pre class="prettyprint"><code class=" hljs objectivec">func GetSnowflakeId() int64 { curTimeStamp := time<span class="hljs-variable">.Now</span>()<span class="hljs-variable">.UnixNano</span>() / <span class="hljs-number">1000000</span> <span class="hljs-comment">// 同一毫秒</span> <span class="hljs-keyword">if</span> curTimeStamp == lastTimeStamp { sn <span class="hljs-comment">// 序列号占 12 位,十进制范围是 [ 0, 4095 ]</span> <span class="hljs-keyword">if</span> sn > <span class="hljs-number">4095</span> { time<span class="hljs-variable">.Sleep</span>(time<span class="hljs-variable">.Millisecond</span>) curTimeStamp = time<span class="hljs-variable">.Now</span>()<span class="hljs-variable">.UnixNano</span>() / <span class="hljs-number">1000000</span> lastTimeStamp = curTimeStamp sn = <span class="hljs-number">0</span> } <span class="hljs-comment">// 取 64 位的二进制数 0000000000 0000000000 0000000000 0001111111111 1111111111 1111111111 1 ( 这里共 41 个 1 )和时间戳进行并操作</span> <span class="hljs-comment">// 并结果( 右数 )第 42 位必然是 0, 低 41 位也就是时间戳的低 41 位</span> rightBinValue := curTimeStamp & <span class="hljs-number">0x1FFFFFFFFFF</span> <span class="hljs-comment">// 机器 id 占用10位空间,序列号占用12位空间,所以左移 22 位; 经过上面的并操作,左移后的第 1 位,必然是 0</span> rightBinValue <<= <span class="hljs-number">22</span> <span class="hljs-keyword">id</span> := rightBinValue | machineID | sn <span class="hljs-keyword">return</span> <span class="hljs-keyword">id</span> } <span class="hljs-keyword">if</span> curTimeStamp > lastTimeStamp { sn = <span class="hljs-number">0</span> lastTimeStamp = curTimeStamp <span class="hljs-comment">// 取 64 位的二进制数 0000000000 0000000000 0000000000 0001111111111 1111111111 1111111111 1 ( 这里共 41 个 1 )和时间戳进行并操作</span> <span class="hljs-comment">// 并结果( 右数 )第 42 位必然是 0, 低 41 位也就是时间戳的低 41 位</span> rightBinValue := curTimeStamp & <span class="hljs-number">0x1FFFFFFFFFF</span> <span class="hljs-comment">// 机器 id 占用10位空间,序列号占用12位空间,所以左移 22 位; 经过上面的并操作,左移后的第 1 位,必然是 0</span> rightBinValue <<= <span class="hljs-number">22</span> <span class="hljs-keyword">id</span> := rightBinValue | machineID | sn <span class="hljs-keyword">return</span> <span class="hljs-keyword">id</span> } <span class="hljs-keyword">if</span> curTimeStamp < lastTimeStamp { <span class="hljs-keyword">return</span> <span class="hljs-number">0</span> } <span class="hljs-keyword">return</span> <span class="hljs-number">0</span> } func main() { <span class="hljs-keyword">id</span>:=GetSnowflakeId() fmt<span class="hljs-variable">.Println</span>(<span class="hljs-keyword">id</span>) }</code></pre> 到此这篇关于“雪花算法golang实现”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!您可能感兴趣的文章:
让你的博客飘雪花超出屏幕依然看得见
如何使用HTML5 canvas实现雪花飘落
想系统学习GO语言(Golang
雪花算法golang实现
用canvas实现简单的下雪效果(附代码)
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
[golang]简单雪花算法_SnowFlake
数据结构和算法(Golang实现)(10)基础知识-算法复杂度主方法
用php生成带有雪花背景的验证码
GoLang雪花算法和反推
[关闭]